真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

DllImport自動選擇x64或x86dll-創(chuàng)新互聯(lián)

Pinvoke的多平臺問題

如果您沒有接觸過如何調(diào)用非托管dll,沒有了解過c#的DllImportAttribute,可以看看以下資料:

網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)建站擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。

1、DllImportAttribute

2、Pinvoke

3、extern 關(guān)鍵字

多平臺支持問題來源:

1、c的庫是編譯時(shí)確定了平臺,比如x86或x64,一個(gè)dll不能在運(yùn)行時(shí)既支持x86也支持x64,所以如果引用它的.net程序還想支持any cpu,只能在運(yùn)行后根據(jù)平臺去加載對應(yīng)平臺的c的庫;

2、DllImport 特性要求傳入string dllName參數(shù),這個(gè)參數(shù)可以是相對路徑或絕對路徑,但.Net的特性有個(gè)要求:特性實(shí)參必須是特性形參類型的常量表達(dá)式、typeof 表達(dá)式或數(shù)組創(chuàng)建表達(dá)式。也就是說string dllName這個(gè)值必須在寫代碼的時(shí)候(編譯時(shí))就是常量的,而不能在運(yùn)行時(shí)傳給它;

3、DllImport 特性是密封的,我們不能繼承它或修改它的什么邏輯,到達(dá)運(yùn)行時(shí)得到與平臺匹配的string dllName的值 ;

Pinvoke的多平臺解決方案

1、繞過DllImport

InteropDotNet

這是開源在github上的一個(gè)項(xiàng)目,作者使用了LoadLibrary(c.dll) + GetProcAddress 轉(zhuǎn)換為.Net委托的思想來完成,對于c.dll的所有函數(shù)的調(diào)用上,實(shí)際上已經(jīng)完全脫離了.Net提供的DllImport特性,所以不受到上面問題2與3的約束,使用本項(xiàng)目,調(diào)用c.dll的.net程序也可是any cpu了。

2、筆者的方案

筆者的方案還是沿用.Net的DllImport特性,我們知道DllImport會幫我們自動查找到加載c.dll,然后大概才把DllImport聲明的外部實(shí)現(xiàn)方法與c.dll的函數(shù)地址映射上,如果我們在準(zhǔn)備調(diào)用c.dll的外部方法之前,通過LoadLibrary Api把c.dll加載到.net程序里,DllImport會不會就不再搜索c.dll而是直接使用?

實(shí)驗(yàn)開始

將c.dll對應(yīng)的x86與x64兩個(gè)版本都放在.net程序的子目錄,構(gòu)造如下:

dotnet.exe

x86\c.dll

x64\c.dll

dotnet.exe DllImport聲明如下:

[DllImport("c.dll")]
static extern int MethodC ( );

實(shí)驗(yàn)結(jié)果

如果默認(rèn)運(yùn)行,一定會報(bào)找不到dll文件的異常,因?yàn)镈llImport的本程序目錄或系統(tǒng)目錄或path環(huán)境下都沒有找到c.dll;

如果我們在調(diào)用 MethodC 之前,檢測當(dāng)前進(jìn)程是32位還是64位,使用windows api 的LoadLibrary 函數(shù)將x86\c.dll或x64\c.dll加載到本進(jìn)程,就不會報(bào)找不到文件的異常,而且調(diào)用MethodC 也是正常的。

實(shí)驗(yàn)總結(jié)

可以一如既往的使用DllImport特性,如果想要any cpu的效果,在調(diào)用外部實(shí)現(xiàn)方法之前,先將它的dll手動加載。

以下是我的實(shí)現(xiàn)代碼,在靜態(tài)構(gòu)造器里加載正確的dll就行,支持自動x86或x64,而且在asp.net里也能正確找到非托管的dll

DllImport 自動選擇x64或x86 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);
        }
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


本文名稱:DllImport自動選擇x64或x86dll-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://weahome.cn/article/gcccc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部