各位先进大家好
最近在尝试为量测仪器写一个友善的接口
原先用加入参考的静态方式把DLL读进来后
可以很顺利地执行运作
但碰到一个问题
就是连线成功后
DLL就会咬住仪器的USB PORT不放
导致如果突然中断连线后
程式就无法再连上仪器
一定要关闭程式再开才有办法在连上
所以想将原先静态连结DLL的方式全都改成用动态连结
但是有一行有关Delegate、EventHandler的部分可能我观念太差
一直改不成功
希望有先进能指导我一下
静态连结程式码:
public partial class Form1 : Form
{
//宣告
private InteropSRVRLib.C0200 objC0200;
private InteropSRVRLib.C0 objC0;
private void button1_Click(object sender, EventArgs e)
{
objC0200 = new InteropSRVRLib.C0200();
objC0 = objC0200.SingleC0;
//就是这一行
objC0.ExeCal += new InteropSRVRLib._C0Events_ExeCalEventHandler(
objC0_ExeCal);
....
}
private void objC0_ExeCal()
{
....
}
}
动态连结程式码:
public partial class Form1 : Form
{
//宣告
private dynamic InteropSRVRLib_C0200; //objC0200;
private dynamic InteropSRVRLib_C0; //objC0;
private void button2_Click(object sender, EventArgs e)
{
Assembly assembly = Assembly.LoadFile("InteropSRVRLib.dll");
Type type1 = assembly.GetType("InteropSRVRLib.C0200Class");
//对应objC0200 = new InteropSRVRLib.C0200();
InteropSRVRLib_C0200 = Activator.CreateInstance(type1);
//对应objC0 = objC0200.SingleC0;
InteropSRVRLib_C0 = InteropSRVRLib_C0200.SingleC0;
//以下一大段都只为了实现objC0.ExeCal +=
// new InteropSRVRLib._C0Events_ExeCalEventHandler(objC0_ExeCal);
Type type2 = assembly.GetType("InteropSRVRLib.C0Class");
EventInfo ev1 = type2.GetEvent("ExeCal");
MethodInfo objC0_ExeCalMethod = typeof(Form1).GetMethod("objC0_ExeCal",
BindingFlags.NonPublic | BindingFlags.Instance);
//Type type3 = assembly.GetType("InteropSRVRLib._C0Events_ExeCalEventHandler");
//dynamic c = Activator.CreateInstance(type3,objC0_ExeCalMethod);
//↑也是错误,说不到建构子
Delegate d = Delegate.CreateDelegate(ev1.EventHandlerType,
objC0_ExeCalMethod);
//↑想要制造 d = InteropSRVRLib._C0Events_ExeCalEventHandler(objC0_ExeCal)
// 但执行后却一直报错说"系结至目标方法时发生错误。"
ev1.AddEventHandler(InteropSRVRLib_C0.ExeCal, d);
//应该是对应objC0.ExeCal += d的意思吧?
.....
}
private void objC0_ExeCal()
{
....
}
}
Delegate.CreateDelegate应该怎么改连结的到目标啊??