如何在单独的 AppDomain 中处理来自 Usercontrol 的事件

How to handle events from Usercontrol in separate AppDomain

提问人:Seer 提问时间:8/6/2023 最后编辑:Seer 更新时间:8/6/2023 访问量:59

问:

我有许多带有用户控件的 dll 程序集,我将它们加载到主窗口中的 Border 控件中(就像旧的 MDI 方法一样)。 我现在希望将这些程序集加载到单独的 AppDomain 中。 我无法让父 AppDomain 接收用户控件中引发的事件。

我目前拥有的(运行良好)

Dim CurrentAssembly As Assembly = Reflection.Assembly.Load("SimpleAss")
MenuFeatureUC = CurrentAssembly.GetType("SimpleNS.UserControl1")
Dim CurrentInstance As FrameworkElement = Activator.CreateInstance(MenuFeatureUC)
ContentHostBrDr.Child = CurrentInstance

UserContrtols 可以引发到父窗口中的 –例如-disable 按钮的事件处理程序如下所示:

Dim Events = CurrentInstance.GetType().GetEvents()
Dim DisableHandlerMethod = Me.GetType().GetMethod("DisableHandler")
For Each ev In Events   
  If ev.Name = "DisableMethodInParent" Then`
    ev.AddEventHandler(obj, [Delegate].CreateDelegate(ev.EventHandlerType, Me, DisableHandlerMethod))
  End If
Next
Public Sub DisableHandler(ByVal sender As Object, ByVal e As EventArgs)
    MainWindowButton.IsEnabled=false
End Sub

UserControls 根据需要引发这些事件。

Public Class UserControl1
Public Event DisableMethodInParent As EventHandler

Private Sub RaiseDisableEventBut_Click(sender As Object, e As RoutedEventArgs) Handles RaiseDisableEventBut.Click
        RaiseEvent DisableMethodInParent(Me, EventArgs.Empty)
End Sub
End Class

我能做些什么我可以使用此代码将用户控件加载到单独的 AppDomain 中。它运作良好。

Dim domaininfo As New AppDomainSetup()
domaininfo.ApplicationBase = System.Environment.CurrentDirectory
Dim adevidence As Evidence = AppDomain.CurrentDomain.Evidence
SeparateAppDomain = AppDomain.CreateDomain("SeparateDomain", adevidence, domaininfo)
Dim ProxyType As Type = GetType(Proxy)
ProxyInst = DirectCast(SeparateAppDomain.CreateInstanceAndUnwrap( ProxyType.Assembly.FullName, ProxyType.FullName), Proxy)
ProxyInst.InitDomainWPFPlugin("SimpleAss", "SimpleNS.UserControl1")
Dim contract = DirectCast(SeparateAppDomain.GetData(SlotName), INativeHandleContract)
Dim control = FrameworkElementAdapters.ContractToViewAdapter(contract)
ContentHostBrDr.Child = control

...

Public Class Proxy
Inherits MarshalByRefObject

Public Sub InitDomainWPFPlugin(ByVal AssemblyName As String, ByVal TypeName As String)
  Dim WPFControl As Control = DirectCast( AppDomain.CurrentDomain.CreateInstanceAndUnwrap( AssemblyName, TypeName), Control)
  Dim host = New Border With {.Child = WPFControl}
  Dim contract = FrameworkElementAdapters.ViewToContractAdapter(host)
AppDomain.CurrentDomain.SetData(SlotName, contract)
End Sub
End Class

我不能做什么我无法让事件处理跨 AppDomain 边界工作。大多数示例都需要 Inherits MarshalByRefObject 这是用户控件无法做到的。 我遇到的关于包装器的例子与我的场景不够接近,或者太复杂而我无法理解。 我将不胜感激任何关于使活动运作所需的帮助。

WPF vb.net 用户控件 AppDomain 事件处理程序

评论


答: 暂无答案