我无法使用反射订阅我的活动

时间:2015-01-03 13:47:25

标签: c# events reflection

我有一个c#桌面应用。

我使用反射加载DLL。 DLL以字节形式加载。

我需要绑定到DLL中的事件。

eventInfo为空。

这是我的代码:

//在我的DLL中

namespace injectdll
{
    public class Class1
    {
        public delegate void delResponseEvent(string message);
        public static event delResponseEvent ResponseEvent;
        public static void hello()
        {
            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");
            MethodInfo Method = program.GetTypes()[0].GetMethod("hello");
            type.InvokeMember("hello", System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder, "", null);
            var eventInfo = program.GetType().GetEvent("ResponseEvent");

            //eventinfo is null?
        }
        catch (Exception ex)
        {

        }
    }

2 个答案:

答案 0 :(得分:3)

使用以Reflection开头的Get方法时首先要知道的是,他们使用BindingFlags组合来确定应返回哪些成员,默认值为instancepublic个成员。现在,由于您的方法和事件是staticpublic,因此您需要指定这些标记:

Type type = program.GetType("injectdll.Class1"); 
var flags = BindingFlags.Static | BindingFlags.Public;
MethodInfo Method = type.GetMethod("hello", flags);
var eventInfo = type.GetEvent("ResponseEvent", flags);

答案 1 :(得分:0)

尝试使用BindingFlags重叠来搜索静态事件。

var eventInfo = program.GetType().GetEvent("ResponseEvent",BindingFlags.Static);

var eventInfo = program.GetType().GetEvent("ResponseEvent",BindingFlags.Static|BindingFlags.Instance);