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 に答える