处理从动态加载的.NET dll引发的事件

3
我是一名有用的助手,可以为您进行翻译。以下是您需要翻译的内容:

我有一个 VB.NET 应用程序,动态加载一些 dll 文件。所有插件都在一个文件夹中,我的应用程序从该文件夹加载所有 dll 文件。

为了加载一个 dll,我使用以下代码

_aAssembly = Reflection.Assembly.LoadFile(_File.FullName)
_aClass = _aAssembly.GetType(_AssemblyName & "." & ClassName)
_aAddin = Activator.CreateInstance(_aClass)

在此dll中运行一个方法

Function RunMethod(ByVal Method As String, Optional ByVal Paramter() As Object = Nothing) As Object
    Dim aMethode As MethodInfo = _aClass.GetMethod(Method)
    Return aMethode.Invoke(_aAddin, Paramter)
End Function

这很完美。但现在我想在我的dll文件中触发一个事件,并在我的主应用程序中处理它们。我开始添加以下代码到我的dll:
Public Shared Event GotSomethingToSend(Str As String)

我使用以下代码触发事件:

RaiseEvent GotSomethingToSend(Str)

我的问题是我不知道如何在主程序中“捕获”事件。这是否可能?我已经尝试过GetEvent()
Dim ei As EventInfo = _aAssembly.GetType(_AssemblyName & "." & ClassName).GetEvent("GotSomethingToSend")

但我没有进展...对此有什么帮助吗?
1个回答

2

您已经拥有一个 EventInfo 实例,只需要将其与应用程序中的方法连接起来即可。尝试调用 EventInfo.AddEventHandler 方法,例如:

ei.AddEventHandler(_aAddin, DirectCast(AddressOf MyGotSomethingToSendHandlerMethod, GotSomethingToSendEventHandler))

Private Delegate Sub GotSomethingToSendEventHandler(str As String)

Private Sub MyGotSomethingToSendHandlerMethod(str As String)
    ' TODO: Event handling code.
End Sub

注意 - 在这种晚期绑定的情况下,编译器无法推断正确的委托类型,因此需要进行类型转换。
补充说明:
虽然上述代码应该可以实现您想要的功能,但是微软建议您遵循他们所有事件签名的通用标准(sender As Object, e As TEventArgs)。如果您想这样做,可以按以下方式重新设计代码:
' Encapsulate all event data in a dedicated class.
Public Class GotSomethingToSendEventArgs
    Inherits EventArgs
    Public Property Data As String
End Class

' Handler method now looks like this.
Private Sub MyGotSomethingToSendHandlerMethod(sender As Object, e As GotSomethingToSendEventArgs)
End Sub

' Wire-up code now looks like this.
ei.AddEventHandler(_aAddin, DirectCast(AddressOf MyGotSomethingToSendHandlerMethod, EventHandler(Of GotSomethingToSendEventArgs)))

感谢您的回答。处理程序方法应该是什么样子?因为当我使用简单的“sub”时出现错误:'AddressOf'表达式无法转换为'System.Delegate',因为类型'System.Delegate'被声明为'MustInherit'并且不能被创建。 - Alex
Private Sub MyGotSomethingToSendHandlerMethod(Str As String) 应该可以正常工作... - Christian Hayter
现在我已经在IDE中尝试过了,更新答案。 :-) - Christian Hayter
再次感谢。看起来好多了。但是...还有些问题。AddEventHandler方法会导致System.ArgumentException异常。程序不会崩溃,但不会执行更多的代码。所以如果我在调用AddEventHandler之后添加一个消息框,它永远不会显示。这变得非常复杂。也许我需要重新考虑我的概念... - Alex
它似乎都是非常晚期绑定的,我认为问题就在这里。当我编写插件时,我让它们实现一个单一接口,并完全通过该接口与它们交互。如果我需要回调,我只需通过接口将强类型委托传递给插件即可。 - Christian Hayter
嗯,好的。感谢你的所有帮助!我会尽力去深入思考并自己阅读更多相关内容。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接