2013-01-03 48 views
3

我有一個VB.NET應用程序動態加載一些DLL文件。所有的插件都在一個文件夾中,我的應用程序從這個文件夾加載所有的dll文件。處理事件從動態加載的.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") 

但我沒有走得很遠......任何幫助?

回答

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))) 
+0

感謝您的回答。處理程序的方法如何?因爲當我使用一個簡單的'sub'時我得到一個錯誤:'AddressOf'表達式不能轉換爲'System.Delegate',因爲類型'System.Delegate'被聲明爲'MustInherit'並且不能創建 – Alex

+0

'Private Sub MyGotSomethingToSendHandlerMethod作爲字符串)'應該可以正常工作... –

+0

這不起作用。仍然是'AddressOf'錯誤。 – Alex