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 附加为在主类的程序集中创建的对象,但它抱怨在不同的程序集中有两个相同的对象类型......

任何帮助,将不胜感激。

4

2 回答 2

2

在多个程序集中定义 GestureEventHandler/Args 是一个严重的问题。您永远不会获得与事件匹配的事件处理程序方法签名,.NET 类型的标识包括声明它的程序集。在您解决核心问题之前,这不会变得更好,只有一个程序集应该声明 GestureEventHandler /Args 并且它应该被所有可以引发事件的程序集引用。还有你的项目。

使用 Reflection.Emit 为事件处理程序动态生成代码是一种绝望的解决方案。

于 2013-01-23T16:40:40.247 回答
1

如果我理解这一点,你有以下结构

程序集 1 - 定义 GestureDetected Event 和 GestureEventArgs 的一个版本。程序集 2 - 定义 GestureDetected Event 和 GestureEventArgs 的一个版本。Assembly 3 - Dynamicaly 发现这些事件并尝试将它们连接到处理程序。

如果是这种情况,Assembly 3 引用的是哪个版本的 GestureEventArgs?

如果程序集 3 引用程序集 1 中的 GestureEventArgs 版本,则当 for 循环尝试挂钩程序集 2 中的事件时,您应该期望得到绑定异常(您可以检查这一点)

在不太了解您要设计的内容的情况下,我建议您可以通过创建一个定义了所有这些常见类型的通用库并在所有 dll 之间共享该库来解决此问题(这将为您提供一个插件类型架构)

于 2013-01-23T16:10:11.740 回答