从不同的应用程序域(复合 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: 

从不同的应用程序域(复合 UI)获取对用户控件的引用

一位

同事向我指出了一个可能的方向:.NET 加载项框架

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

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