捕获由反射的 dll 引发的事件

trap an event raised by a reflected dll

我有一个桌面 C# 应用程序。

我动态加载一个 DLL。

我参加了一个活动。

我现在想在我的应用程序中捕获事件。

所以,这是我反映的 DLL:

namespace injectdll
{
    public class Class1
    {
        public delegate void delResponseEvent(string message);
        public static event delResponseEvent ResponseEvent;
        public static void hello()
        {
            if (ResponseEvent != null)
            {
                ResponseEvent("hello andy");
            }
        }
    }
}

这是我的桌面应用程序的一部分:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\Andrew\Desktop\testbytes\injectdll\injectdll\bin\Debug\injectdll.dll");
            Assembly program = Assembly.Load(bytes);
            Type type = program.GetType("injectdll.Class1");
            var flags = BindingFlags.Static | BindingFlags.Public;
            MethodInfo Method = type.GetMethod("hello", flags);
            var eventInfo = type.GetEvent("ResponseEvent", flags);               
            type.InvokeMember("hello", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, "", null);
        }
        catch (Exception ex)
        {

        }
    }

我现在需要这样的东西:

private void FunctionInMyDEsktopApp(string message)
{
   //this has been raised in my DLL
}

这样的事情怎么样:

...
var eventInfo = type.GetEvent( "ResponseEvent", flags );
var d = Delegate.CreateDelegate( eventInfo.EventHandlerType, this,
                                 "FunctionInMyDEsktopApp" )
eventInfo.AddEventHandler( null, d );
...

由于您也没有委托的类型,因此您可以使用 EventInfo.EventHandlerType 获取它。有关 AddEventHandler here.

的更多信息