从不同的应用程序域(复合 UI)获取对用户控件的引用
本文关键字:获取 用户 控件 引用 复合 应用程序域 UI | 更新日期: 2023-09-27 17:48:55
如何在应用程序中创建的表单上托管在不同应用程序域中创建的 WinForms Control
(或 WPF Window
)?
我正在尝试创建一个复合 UI 应用程序,它是插件的无功能的 shell/主机,其中这些插件完全在自己的应用程序域中运行,因此我希望能够从这些插件中获取 UserControl 对象以"托管"在主机进程主窗体上的某种容器控件中。
我以为我已经破解了它,但由于应用程序域之间的对话涉及MarshallByRefObject代理,我不能采用我的第一个原型方法:
shellForm.Panel1.Controls.Add(proxyObjectForUserControlInOtherAssembly);
我已经在问题末尾发布了我从中得到的例外。
我确实尝试直接获得控制权:
var ctl = Control.FromHandle(proxyObjectForUserControlInOtherAssembly.Handle);
shellForm.Panel1.Controls.Add(ctl);
这给出了可预见的结果。我得到了 hWnd 没问题,但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:
一位
同事向我指出了一个可能的方向:.NET 加载项框架
就我而言,该页面的关键点如下:
这些段的组件是 不需要在同一位置 应用程序域。您可以加载一个 外接程序到其自己的新应用程序中 域,放入现有应用程序中 域,甚至进入主机的 应用程序域。您可以加载 多个加载项到同一个 应用程序域,它启用 用于共享资源的加载项和 安全上下文。