0

別のアセンブリから同じアセンブリから読み込まれたオブジェクトにデリゲートを割り当てようとして、楽しい時間を過ごしています。

loader.LoadedGestures は object[] です - その中の各オブジェクトは異なる .dll から取得されます。その配列内のすべてのオブジェクトが、下に定義されている GestureDetected をトリガーできるようにしたいと考えています。

public class Foo
{
    private void Initialise_Gestures()
    {
        loader = new GestureLoader();

        loader.LoadGestures(); // load all the Gestures into the array

        for (int i = 0; i < loader.LoadedGestures.Length; i++)
        {
            if (loader.LoadedGestures[i] != null)
            {
                EventInfo ev = loader.LoadedGestures[i].GetType().GetEvent("GestureDetected");
                Type del = ev.EventHandlerType;
                MethodInfo mi = this.GetType().GetMethod("GestureDetected", BindingFlags.NonPublic | BindingFlags.Instance);

                Delegate d = Delegate.CreateDelegate(del, this, mi); // <- "Error binding to target method."

                ev.AddEventHandler(loader.LoadedGestures[i], d);
            }
        }
    }



    private void GestureDetected(object sender, GestureEventArgs e)
    {
        // do stuff
    }
}

問題は、GestureEventArgs と GestureEventHandler が各 .dll で定義されているか、コンパイルされないことです。メイン クラスのアセンブリ内で作成されたオブジェクトとして GestureEventHandler をアタッチしようとしましたが、異なるアセンブリに同じオブジェクト タイプが 2 つあることに不満を感じています...

どんな助けでも大歓迎です。

4

2 に答える 2

2

複数のアセンブリで GestureEventHandler/Args を定義すると、重大な問題が発生します。イベント ハンドラー メソッドのシグネチャがイベントに一致することはありません。.NET 型の ID には、それが宣言されたアセンブリが含まれます。これは、コアの問題を修正するまで改善されません。1 つのアセンブリのみが GestureEventHandler を宣言する必要があります。 /Args であり、イベントを発生させることができるすべてのアセンブリによって参照される必要があります。そしてあなたのプロジェクト。

Reflection.Emit を使用してイベント ハンドラーのコードを動的に生成することは、絶望的な解決策です。

于 2013-01-23T16:40:40.247 に答える
1

私がこの権利を理解していれば、あなたは次の構造を持っています

アセンブリ 1 - GestureDetected Event および GestureEventArgs のバージョンを定義します。アセンブリ 2 - GestureDetected Event および GestureEventArgs のバージョンを定義します。アセンブリ 3 - これらのイベントを動的に検出し、ハンドラーに接続しようとします。

その場合、Assembly 3 が参照している GestureEventArgs のバージョンはどれですか?

アセンブリ 3 がアセンブリ 1 の GestureEventArgs のバージョンを参照している場合、for ループがアセンブリ 2 からイベントをフックしようとすると、バインド例外が発生することが予想されます (これを確認できます)。

設計しようとしていることをあまり知らなくても、これらすべての共通タイプが定義された共通ライブラリを作成し、すべての dll でライブラリを共有することで、この問題を解決できることをお勧めします (これにより、プラグイン タイプ アーキテクチャが得られます)。

于 2013-01-23T16:10:11.740 に答える