陷阱由反射的dll引发的事件

时间:2015-01-03 14:33:26

标签: c# events reflection

我有一个桌面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
}

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

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

由于您没有代表的类型,您可以使用EventInfo.EventHandlerType获取代理类型。有关AddEventHandler here

的更多信息