亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#加載嵌入到資源的非托管dll

 更新時間:2021年05月15日 14:17:29   作者:RyzenAdorer  
很多朋友遇到過這樣一個問題需要加載非win32的非托管dll,糾結(jié)該怎么操作呢,下面通過代碼給大家介紹下C#加載嵌入到資源的非托管dll的方法,感興趣的朋友一起看看吧

如何加載非托管Dll

我們總會遇到需要加載非Win32的非托管dll,這里推薦一種方式就是將那些非win32的非托管dll嵌入資源的方式,在入口解壓并且加載的方式,我先來看看如何實現(xiàn)吧,首先我們準(zhǔn)備好demo,新增控制臺項目如下:

代碼如下:

  static void Main(string[] args)
        {
            UnzipAndLoad();
        }

        /// <summary>
        /// 解壓資源并且加載非托管DLL
        /// </summary>
        static void UnzipAndLoad()
        {
            var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var dllPath = Path.Combine(folderPath, $"{nameof(Resource.pdfium)}.dll");//解壓輸出的路徑
            if (!File.Exists(dllPath))
                File.WriteAllBytes(dllPath, Resource.pdfium);
            LoadDll(dllPath);//應(yīng)該每次都加載非托管
        }

        /// <summary>
        /// 加載非托管DLL
        /// </summary>
        /// <param name="dllName"></param>
        public static void LoadDll(string dllName)
        {
            IntPtr h = LoadLibrary(dllName);
            if (h == IntPtr.Zero)
            {
                Exception e = new Win32Exception();
                throw new DllNotFoundException($"Unable to load library: {dllName}", e);
            }

            Console.WriteLine("Load library successful");
        }

        [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern IntPtr LoadLibrary(string lpFileName);

輸出:

Load library successful

其實上述代碼還有優(yōu)化的空間,微軟集成了很多win32函數(shù)的包,例如我們要導(dǎo)入win32的下常見的kernel32dll和user32dll,我們可以通過nuget安裝,我們可以在csproj加入以下代碼(或者直接nuget搜索PInvoke.Kernel32):

<ItemGroup>
        <PackageReference Include="PInvoke.Kernel32" Version="0.7.104" />
  </ItemGroup>

那么之前的代碼刪除的LoadLibrary方法刪除,LoadDll方法則直接改為以下:

 /// <summary>
    /// 加載非托管DLL
    /// </summary>
    /// <param name="dllName"></param>
    public static void LoadDll(string dllName)
    {
        var h =Kernel32.LoadLibrary(dllName);
        if (h.IsInvalid)//是否是無效的
        {
            Exception e = new Win32Exception();
            throw new DllNotFoundException($"Unable to load library: {dllName}", e);
        }
        Console.WriteLine("Load library successful");
    }

參考

https://blog.lindexi.com/post/%E6%8E%A8%E8%8D%90%E5%AE%98%E6%96%B9%E5%BC%80%E6%BA%90-PInvoke-%E5%BA%93-%E5%8C%85%E5%90%AB%E5%A4%A7%E9%87%8F-win32-%E5%B0%81%E8%A3%85.html

以上就是C#如何加載嵌入到資源的非托管dll的詳細(xì)內(nèi)容,更多關(guān)于C#資源非托管dll的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于WPF開發(fā)簡單的顏色選擇器

    基于WPF開發(fā)簡單的顏色選擇器

    這篇文章主要介紹了如何基于WPF實現(xiàn)簡單的顏色選擇器,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下
    2023-07-07
  • C#反射在實際應(yīng)用中的實例代碼

    C#反射在實際應(yīng)用中的實例代碼

    C#反射在實際應(yīng)用中的實例代碼,需要的朋友可以參考一下
    2013-03-03
  • C#實現(xiàn)凍結(jié)Excel窗口以鎖定行列或解除凍結(jié)

    C#實現(xiàn)凍結(jié)Excel窗口以鎖定行列或解除凍結(jié)

    在處理大型Excel工作簿時,有時候我們需要在工作表中凍結(jié)窗格,這樣可以在滾動查看數(shù)據(jù)的同時保持某些行或列固定不動,下面我們就來看看如何使用C#實現(xiàn)凍結(jié)Excel窗口吧
    2024-04-04
  • C#(.Net)將非托管dll嵌入exe中的實現(xiàn)

    C#(.Net)將非托管dll嵌入exe中的實現(xiàn)

    本文主要介紹了C#(.Net)將非托管dll嵌入exe中的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C#多線程學(xué)習(xí)之(六)互斥對象用法實例

    C#多線程學(xué)習(xí)之(六)互斥對象用法實例

    這篇文章主要介紹了C#多線程學(xué)習(xí)之互斥對象用法,實例分析了C#中互斥對象的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法

    C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法

    這篇文章主要為大家詳細(xì)介紹了C# 6.0 內(nèi)插字符串的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 最新評論