老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

DllImport自動選擇x64或x86dll

Pinvoke的多平臺問題

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

成都創新互聯于2013年開始,是專業互聯網技術服務公司,擁有項目成都網站建設、網站制作網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元新豐做網站,已為上家服務,為新豐各地企業和個人服務,聯系電話:18982081108

1、DllImportAttribute

2、Pinvoke

3、extern 關鍵字

多平臺支持問題來源:

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

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

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

 

Pinvoke的多平臺解決方案

1、繞過DllImport

InteropDotNet

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

 

2、筆者的方案

筆者的方案還是沿用.Net的DllImport特性,我們知道DllImport會幫我們自動查找到加載c.dll,然后大概才把DllImport聲明的外部實現方法與c.dll的函數地址映射上,如果我們在準備調用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的本程序目錄或系統目錄或path環境下都沒有找到c.dll;

如果我們在調用 MethodC 之前,檢測當前進程是32位還是64位,使用windows api 的LoadLibrary 函數將x86\c.dll或x64\c.dll加載到本進程,就不會報找不到文件的異常,而且調用MethodC 也是正常的。

 

實驗總結

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

以下是我的實現代碼,在靜態構造器里加載正確的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);
        }
}

分享名稱:DllImport自動選擇x64或x86dll
鏈接URL:http://www.xueling.net.cn/article/ishjod.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 人人妻人人澡人人爽欧美一区 | 国产精品乱人伦 | 国精产品一区一区三区有限公司杨 | 护士扒下内裤让我爽一夜 | 日皮视频国产 | 黄色片在线 | 日韩成人福利视频 | 99精品国产高清一区二区麻豆 | 久热中文字幕在线精品观 | 亚洲成人精品区 | 中国熟女撒尿毛茸茸 | 3D动漫同人精品无码专区 | 国产日产欧产精品浪潮的隐私保护 | 2021av在线| 日本中文不卡 | 国产区在线视频 | 青青草在线视频免费观看 | 日本网站一区二区三区 | 国产精品国产三级国产aⅴ无密码 | av片免费播放 | 丰满少妇xbxb毛片日本 | 亚洲精品无码久久久久久久久久久久久 | 99久久全国免费观看 | 999国产精品亚洲77777 | 国产欧美日韩亚洲精品区 | 亚洲精品久久久久久久久 | 精品人伦一区二区三区潘金莲 | 欧美大波乳人伦免费视频 | 日本高清免费aaaaa大片视频 | 免费99视频| 完美世界免费观看完整 | 欧美成人a视频 | 强壮的公次次弄得我高潮a片日本 | 爆乳3把你榨干哦ova在线观看 | 女人免费视频 | 婷婷成人基地 | 亚洲成色综合网站yy | RUNAWAY在线观看韩国动漫 | 国产一级第一级毛片 | 亚洲综合无码一区二区三区 |