如果您沒有接觸過如何調(diào)用非托管dll,沒有了解過c#的DllImportAttribute,可以看看以下資料:
網(wǎng)站制作、成都網(wǎng)站設計介紹好的網(wǎng)站是理念、設計和技術的結合。創(chuàng)新互聯(lián)建站擁有的網(wǎng)站設計理念、多方位的設計風格、經(jīng)驗豐富的設計團隊。提供PC端+手機端網(wǎng)站建設,用營銷思維進行網(wǎng)站設計、采用先進技術開源代碼、注重用戶體驗與SEO基礎,將技術與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。1、DllImportAttribute
2、Pinvoke
3、extern 關鍵字
多平臺支持問題來源:
1、c的庫是編譯時確定了平臺,比如x86或x64,一個dll不能在運行時既支持x86也支持x64,所以如果引用它的.net程序還想支持any cpu,只能在運行后根據(jù)平臺去加載對應平臺的c的庫;
2、DllImport 特性要求傳入string dllName參數(shù),這個參數(shù)可以是相對路徑或絕對路徑,但.Net的特性有個要求:特性實參必須是特性形參類型的常量表達式、typeof 表達式或數(shù)組創(chuàng)建表達式。也就是說string dllName這個值必須在寫代碼的時候(編譯時)就是常量的,而不能在運行時傳給它;
3、DllImport 特性是密封的,我們不能繼承它或修改它的什么邏輯,到達運行時得到與平臺匹配的string dllName的值 ;
InteropDotNet
這是開源在github上的一個項目,作者使用了LoadLibrary(c.dll) + GetProcAddress 轉換為.Net委托的思想來完成,對于c.dll的所有函數(shù)的調(diào)用上,實際上已經(jīng)完全脫離了.Net提供的DllImport特性,所以不受到上面問題2與3的約束,使用本項目,調(diào)用c.dll的.net程序也可是any cpu了。
筆者的方案還是沿用.Net的DllImport特性,我們知道DllImport會幫我們自動查找到加載c.dll,然后大概才把DllImport聲明的外部實現(xiàn)方法與c.dll的函數(shù)地址映射上,如果我們在準備調(diào)用c.dll的外部方法之前,通過LoadLibrary Api把c.dll加載到.net程序里,DllImport會不會就不再搜索c.dll而是直接使用?
將c.dll對應的x86與x64兩個版本都放在.net程序的子目錄,構造如下:
dotnet.exe
x86\c.dll
x64\c.dll
dotnet.exe DllImport聲明如下:
[DllImport("c.dll")]
static extern int MethodC ( );
如果默認運行,一定會報找不到dll文件的異常,因為DllImport的本程序目錄或系統(tǒng)目錄或path環(huán)境下都沒有找到c.dll;
如果我們在調(diào)用 MethodC 之前,檢測當前進程是32位還是64位,使用windows api 的LoadLibrary 函數(shù)將x86\c.dll或x64\c.dll加載到本進程,就不會報找不到文件的異常,而且調(diào)用MethodC 也是正常的。
可以一如既往的使用DllImport特性,如果想要any cpu的效果,在調(diào)用外部實現(xiàn)方法之前,先將它的dll手動加載。
以下是我的實現(xiàn)代碼,在靜態(tài)構造器里加載正確的dll就行,支持自動x86或x64,而且在asp.net里也能正確找到非托管的dll
static class MQTTAsync { private const string mqtt3a_dll = "paho-mqtt3a.dll"; [DllImport(mqtt3a_dll, CallingConvention = CallingConvention.Cdecl)] public static extern MqttError MQTTAsync_connect( IntPtr handle, ref MQTTAsync_connectOptions options); [DllImport("kernel32")] private static extern IntPtr LoadLibraryA( [MarshalAs(UnmanagedType.LPStr)] string fileName); static MQTTAsync() { var dllFile = Path.Combine(Environment.Is64BitProcess ? "x64" : "x86", mqtt3a_dll); if (HttpContext.Current != null) { dllFile = Path.Combine("~\\bin", dllFile); dllFile = HttpContext.Current.Server.MapPath(dllFile); } MQTTAsync.LoadLibraryA(dllFile); } }
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文題目:DllImport自動選擇x64或x86dll-創(chuàng)新互聯(lián)
當前路徑:http://aaarwkj.com/article22/gcccc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、全網(wǎng)營銷推廣、用戶體驗、電子商務、定制開發(fā)、面包屑導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)