我有一个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)
{
}
}
答案 0 :(得分:3)
使用以Reflection
开头的Get
方法时首先要知道的是,他们使用BindingFlags
组合来确定应返回哪些成员,默认值为instance
和public
个成员。现在,由于您的方法和事件是static
和public
,因此您需要指定这些标记:
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);