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

时间:2013-01-03 13:47:17

标签: .net plugins dll

我有一个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 个答案:

答案 0 :(得分: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)))