关于dllimport的使用
最近做一個動態(tài)加載插件的項目,插件中的dll 主要是各廠商各型號的讀卡器的通用類庫,stdapi.dll,WltRS.dll,有的還有進(jìn)一步封裝的dll,主要是為了簡化通用類庫的操作。
這些類庫都是用C語言,或者C++來編寫的,我的項目是用C#語言編寫,通過Dllimport來調(diào)用這些非托管dll的方法。
在做這個項目的時候,由于之前的讀卡器類庫都是通用的,所以即時使用兩款或者更多款讀卡器設(shè)備,加載的都是同一類dll,不會出現(xiàn)問題。
但是在開發(fā)與通用類庫不兼容的插件的時候(都是讀卡器插件),問題出現(xiàn)了。
一:輸入用戶名,密碼,登陸系統(tǒng)。
?1:該用戶能使用的設(shè)備如果都是調(diào)用通用類庫的讀卡器,那么使用起來沒有問題;
?2:該用戶能使用的設(shè)備只要有一款與其他的不同,那么在切換的時候問題就出現(xiàn)了。
什么問題呢?
假如現(xiàn)在有兩個設(shè)備,A和B,A屬于可以調(diào)用通用類庫的設(shè)備,B不能調(diào)用通用類庫,但是有自己的一套單獨(dú)的類庫。
當(dāng)我啟用A設(shè)備的時候,第一次執(zhí)行DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”)后,那么這兩個dll就會加載到內(nèi)存中。
這個時候我把A設(shè)備禁用,啟用B設(shè)備,B設(shè)備也有這樣的調(diào)用語句,DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”),但是B設(shè)備的這兩個dll與A設(shè)備的不同,
大家猜猜看,這個時候B設(shè)備調(diào)用的是哪一個dll??
一開始,我以為B設(shè)備調(diào)用的是自己目錄下的dll。但是經(jīng)過多次試驗,我發(fā)現(xiàn)我錯了。
只要是同名的dll,如果不指定絕對路徑方式進(jìn)行加載,那么第一次加載之后的所有調(diào)用語句都是調(diào)用的第一次加載的那個dll中的方法。
所以就造成了設(shè)備使用的紊亂。但是如果這樣 DllImport(“sdtapi.dll”)或者DllImport(“WltRS.dll”),和DllImport(“C:\\sdtapi.dll”)或者DllImport(“C:\\WltRS.dll”),
調(diào)用的卻不是同一個dll,操作系統(tǒng)就會分別調(diào)用。我們的程序不能這樣寫,不然對用戶的約束性就太大了。。
針對這個問題,我的解決辦法是,將各個插件目錄下的文件重新命名,然后將代碼中的Dllimport中的代碼改成一致的名字,就OK了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/onsuccessway/p/3370257.html
總結(jié)
以上是生活随笔為你收集整理的关于dllimport的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]Windows Phone 7程序
- 下一篇: 水一篇