提问人:Seer 提问时间:8/6/2023 最后编辑:Seer 更新时间:8/6/2023 访问量:59
如何在单独的 AppDomain 中处理来自 Usercontrol 的事件
How to handle events from Usercontrol in separate AppDomain
问:
我有许多带有用户控件的 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 这是用户控件无法做到的。 我遇到的关于包装器的例子与我的场景不够接近,或者太复杂而我无法理解。 我将不胜感激任何关于使活动运作所需的帮助。
答: 暂无答案
评论