如何在应用程序中创建的表单上托管在其他AppDomain中创建的WinForms Control(或WPF Window)?

我正在尝试创建一个复合UI应用程序,该应用程序是插件的无功能外壳/主机,这些插件完全在其自己的应用程序域中运行,因此我希望能够从这些插件中获取UserControl对象以“托管”在其中对宿主进程的主要形式的某种容器控制。

我以为我可以破解它,但是由于应用程序域之间的对话涉及MarshallByRefObject代理,所以我不能采用我的第一个原型方法:

shellForm.Panel1.Controls.Add(proxyObjectForUserControlInOtherAssembly);


我在问题的末尾发布了我从中得到的例外。

我确实可以直接获得控制权:

var ctl = Control.FromHandle(proxyObjectForUserControlInOtherAssembly.Handle);
shellForm.Panel1.Controls.Add(ctl);


这给出了可预测的结果。我没有问题,但是Control.FromHandle()返回null。大概是因为该句柄是在其他appdomain上创建的。

如果我对此无可奈何,我将非常感激朝着正确方向的oke。 :)

提前谢谢了。



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:

最佳答案

一位同事向我指出了一个可能的方向:.NET Add-in Framework

对于我而言,该页面的关键点如下:


  这些段的组件是
  不需要相同
  应用程序域。您可以加载
  加载到自己的新应用程序中
  域,到现有应用程序中
  域,甚至进入主机
  应用程序域。您可以加载
  多个加载项都在同一个
  应用程序域
  外接程序共享资源和
  安全上下文。

关于c# - 从其他appdomain(复合UI)获得对UserControl的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5568955/

10-09 06:42