Получить ссылку на UserControl из другого домена приложения (составной пользовательский интерфейс) - PullRequest
3 голосов
/ 06 апреля 2011

Как я могу разместить 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: 

1 Ответ

4 голосов
/ 06 апреля 2011

Коллега указал мне на одно возможное направление: .NET Framework для надстроек

Для этой цели с этой страницы я хочу сказать следующее:

Сборки для этих сегментов не обязательно должны находиться в одном домене приложения.Вы можете загрузить надстройку в свой собственный новый домен приложения, в существующий домен приложения или даже в домен приложения хоста.Вы можете загрузить несколько надстроек в один домен приложения, что позволяет надстройкам совместно использовать ресурсы и контексты безопасности.

...