如何在我的应用程序中创建的表单上托管另一个AppDomain中的WinForms Control
(或WPF Window
)?
我正在尝试创建一个复合UI应用程序,它是插件的无特征shell /主机,其中这些插件完全在他们自己的应用程序域中运行,所以我希望能够从这些插件中获取UserControl对象“托管“在主机进程的主要表单上的某种容器控件。
我以为我已经破解了它,但由于appdomains之间的对话涉及MarshallByRefObject代理,我不能采用我的第一个原型方法:
shellForm.Panel1.Controls.Add(proxyObjectForUserControlInOtherAssembly);
我在问题的最后发布了我从中得到的例外情况。
我确实直接获得了控件:
var ctl = Control.FromHandle(proxyObjectForUserControlInOtherAssembly.Handle);
shellForm.Panel1.Controls.Add(ctl);
这给出了可预测的结果。我得到了hWnd,但Control.FromHandle()
返回null。大概是因为句柄是在不同的appdomain上创建的。
如果我无可救药地偏离正轨,我会非常感谢你朝着正确的方向前进。 :)
非常感谢提前。
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:
答案 0 :(得分:4)
我被一位同事指出了一个可能的方向:.NET Add-in Framework
出于我的目的,该页面的关键点如下:
这些细分的装配是 不要求相同 应用领域。你可以加载一个 加载项到自己的新应用程序中 域,进入现有的应用程序 域,甚至进入主机 应用领域。你可以加载 多个加载项相同 应用程序域,它启用 加载项以共享资源和 安全背景。