[问题] 动态连结档与Delegate、EventHandler问题

楼主: eva9234 (eva)   2019-02-26 23:26:34
各位先进大家好
最近在尝试为量测仪器写一个友善的接口
原先用加入参考的静态方式把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应该怎么改连结的到目标啊??
作者: s4300026 (s4300026)   2019-02-27 08:41:00
不好意思,问一下,什么是静态连结?我觉得直接多一个按钮,按下去就释放已建立的外部元件就好啦
作者: cancelpc (阿吉)   2019-02-27 10:07:00
动态连结的方式并部会解决你的问题,系统资源得自己释放。
作者: Litfal (Litfal)   2019-02-27 11:35:00
这跟静态动态DLL连结没关系吧。然后设成null不代表释放资源喔。通常都有个Dispose()可以呼叫才是主动释放unmanaged
作者: anumis (阿努米斯)   2019-02-28 02:07:00
我觉得你的问题是出在 dll 没有提供关闭连线的功能吧?如果你是用把物件设成null的方式强制移出内存,那你试着在下一行呼叫 GC ,看能不能提高稳定度但最佳解还是用dll内的功能自行关闭连线,你要不要再翻翻看文件?
作者: s4300026 (s4300026)   2019-02-28 12:16:00
楼上是释放资源最佳解。但这边还有个重要问题是,原po的程式明明就是开启中,且未释放资源,是什么原因造成断线问题呢,他创建的连线物件去哪里了?

Links booklink

Contact Us: admin [ a t ] ucptt.com