在运行时加载的程序集的事件处理



这是我试图从中学习的场景:

    DLL文件有时会引发事件。
  • DLL文件不能添加到源代码中的引用中,但它在磁盘上可用,并且程序可以在运行时访问它。
  • 我加载DLL文件作为运行时的程序集。
  • 我试图从DLL订阅事件(我知道签名和参数格式),并在我的程序中处理它们。

程序集是一个简单的Dll,其方法将其两个参数相加,并引发一个带有自定义参数(包括求和操作的结果)的事件。以下是DLL的代码:

namespace Dll1
{
    public class Class1
    {
        public int c = 0;
        public void add(int a, int b)
        {
            c =  a + b;
            if (Added !=null)
                Added(this, new AddArgs(c));
        }
        public delegate void AddHandler(object sender, AddArgs e);
        public event AddHandler Added;
    }
    public class AddArgs : EventArgs
    {
        private int intResult;
        public AddArgs(int _Value) 
        {
            intResult = _Value;
        }
        public int Result
        {
            get { return intResult; }
        }
    }
}

然后,在我的程序中,我使用Assembly.LoadFile加载DLL。我在我的程序中有另一个类,名为EventProcessor,它包含一个事件处理程序来处理来自加载程序集的事件:

namespace ConsoleApplication1
{
    class Program
    {
        static Type[] parmTypes;
        static void Main(string[] args)
        {
            Assembly asm = Assembly.LoadFile(@"C:ProjectsDll1.Dll");
            Type typ = asm.GetType("DLL1.Class1", true, true);
            var method = typ.GetMethod("add");
            EventInfo eInfo = typ.GetEvents()[0];
            var obj = Activator.CreateInstance(typ);
            EventProcessor evProc = new EventProcessor();
            Type myTypeObj = evProc.GetType();
            MethodInfo myMethodInfo = myTypeObj.GetMethod("myEventHandler");
            Delegate d = Delegate.CreateDelegate(myTypeObj, myMethodInfo, true); // Error!
            eInfo.AddEventHandler(obj, d);
            method.Invoke(obj, new object[] { 1, 0 });
        }
    }
}

但是,当运行程序时,我得到一个错误消息"Type必须派生自Delegate"。参数名称:"类型"。我哪里做错了?或者有没有更好的方法来处理这种情况?如果有帮助的话,我还在最后添加了事件处理程序类。

namespace ConsoleApplication1
{
    class EventProcessor
    {
        public void myEventHandler(object sender, AddArgs args)
        {
            Console.WriteLine("Event Received.");
        }
    }
    public class AddArgs : EventArgs
    {
        private int intResult;
        public AddArgs(int _Value)
        {
            intResult = _Value;
        }
        public int Result
        {
            get { return intResult; }
        }
    }
}

您的问题是ConsoleApplication1没有对Dll1的引用。即使你在两个程序集中构建了相同的AddArgs,它们仍然是不同的类型,不能互换使用。

解决这个问题的方法是使用一个集ConsoleApplication1Dll1都知道的类型。两个程序集必须使用同一类型。

您还使用了用于静态事件方法的CreateDelegate方法的覆盖。由于您正在尝试连接实例方法,因此还必须提供目标。

相关内容

  • 没有找到相关文章

最新更新