Как я могу разместить WinForms Control
(или WPF Window
в этом отношении), созданный в другом домене приложения в форме, созданной в моем приложении?
Я пытаюсь создать составное приложение пользовательского интерфейса, которое представляет собой безликую оболочку / хост для плагинов, где эти плагины работают полностью в своих собственных доменах приложений, поэтому я хочу иметь возможность получать объекты UserControl из этих плагинов " размещается "в каком-то контроле контейнера в главной форме основного процесса.
Я думал, что взломал его, но поскольку разговоры между доменами приложений связаны с прокси-серверами MarshallByRefObject, я не могу использовать свой первый прототип:
shellForm.Panel1.Controls.Add(proxyObjectForUserControlInOtherAssembly);
Я отправил исключение, которое я получил от этого в конце вопроса.
У меня был шанс получить контроль напрямую:
var ctl = Control.FromHandle(proxyObjectForUserControlInOtherAssembly.Handle);
shellForm.Panel1.Controls.Add(ctl);
Это дало предсказуемые результаты. Я понял, что все в порядке, но Control.FromHandle()
вернул ноль. Предположительно, потому что дескриптор был создан на другом домене приложения.
Я был бы очень признателен за то, чтобы ткнуть в правильном направлении, если бы я безнадежно отклонился от этого. :)
Большое спасибо заранее.
System.Runtime.Remoting.RemotingException was unhandled by user code
Message=Remoting cannot find field 'parent' on type 'System.Windows.Forms.Control'.
Source=mscorlib
StackTrace:
at System.Object.GetFieldInfo(String typeName, String fieldName)
at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at AppDomainTest.Shell.Form1.Display(Control control) in c:\temp\AppDomainTest\AppDomainTest\AppDomainTest.Shell\Form1.cs:line 24
at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
InnerException: