[問題] 動態連結檔與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