我有一个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")
但我没有走得太远......对此有任何帮助吗?
答案 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)))