3

我有一个动态加载一些 dll 文件的 VB.NET 应用程序。所有插件都在一个文件夹中,我的应用程序从该文件夹加载所有 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")

但我没有走得很远......对此有任何帮助吗?

4

1 回答 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

注意 - 类型转换是必需的,因为编译器无法在这种后期绑定方案中推断出正确的委托类型。

附录

尽管上面的代码应该可以满足您的需求,但 Microsoft 建议您坚持所有事件签名 ( 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)))
于 2013-01-03T14:17:14.800 回答