最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

如何加載非托管Dll

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

代碼如下:

  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

其實(shí)上述代碼還有優(yōu)化的空間,微軟集成了很多win32函數(shù)的包,例如我們要導(dǎo)入win32的下常見(jiàn)的kernel32dll和user32dll,我們可以通過(guò)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)//是否是無(wú)效的
        {
            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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)

    C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn)

    這篇文章主要介紹了C# 9.0 新特性之模式匹配簡(jiǎn)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 詳解C# ConcurrentBag的實(shí)現(xiàn)原理

    詳解C# ConcurrentBag的實(shí)現(xiàn)原理

    ConcurrentBag<T>實(shí)現(xiàn)了IProducerConsumerCollection<T>接口,該接口主要用于生產(chǎn)者消費(fèi)者模式下,可見(jiàn)該類(lèi)基本就是為生產(chǎn)消費(fèi)者模式定制的。然后還實(shí)現(xiàn)了常規(guī)的IReadOnlyCollection<T>類(lèi),實(shí)現(xiàn)了該類(lèi)就需要實(shí)現(xiàn)IEnumerable<T>、IEnumerable、 ICollection類(lèi)
    2021-06-06
  • C#線程定義和使用方法詳解

    C#線程定義和使用方法詳解

    這篇文章主要介紹了C#Thread類(lèi)的基本用法,如何定義一個(gè)線程類(lèi),為線程傳遞參數(shù)的方法,詳解看下文
    2013-11-11
  • Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之五子棋游戲

    Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C#驗(yàn)證給定字符串形式日期是否合法的方法

    C#驗(yàn)證給定字符串形式日期是否合法的方法

    這篇文章主要介紹了C#驗(yàn)證給定字符串形式日期是否合法的方法,實(shí)例分析了C#針對(duì)字符串及日期的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#文件目錄操作方法匯總

    C#文件目錄操作方法匯總

    本文主要列舉出C#文件和目錄操作的一些方法,包括創(chuàng)建、移動(dòng)、遍歷目錄,讀寫(xiě)文件等方法,有需要的小伙伴可以學(xué)習(xí)一下。
    2016-04-04
  • WPF PasswordBox進(jìn)行數(shù)據(jù)綁定方法

    WPF PasswordBox進(jìn)行數(shù)據(jù)綁定方法

    有的時(shí)候會(huì)遇見(jiàn)PasswordBox的Password屬性不是依賴(lài)屬性,因此無(wú)法進(jìn)行數(shù)據(jù)綁定。本文介紹如何通過(guò)添加附加屬性解決該問(wèn)題,有此問(wèn)題的同學(xué)可以參考下本文
    2021-06-06
  • C# Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕

    C# Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕

    這篇文章主要為大家詳細(xì)介紹了C# Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 深入了解c#多線程編程

    深入了解c#多線程編程

    這篇文章主要介紹了c#多線程編程的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)c# 多線程,感興趣的朋友可以了解下
    2020-08-08
  • 詳解C# Lazy Loading(延遲加載)

    詳解C# Lazy Loading(延遲加載)

    這篇文章主要介紹了C# Lazy Loading(延遲加載)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

红河县| 河南省| 阿合奇县| 石屏县| 苍溪县| 宾川县| 威远县| 陆良县| 浦县| 酒泉市| 石林| 满城县| 安宁市| 长宁县| 全椒县| 通渭县| 永顺县| 准格尔旗| 嵩明县| 永福县| 马鞍山市| 托克逊县| 福泉市| 邹城市| 岑巩县| 沂源县| 扬州市| 礼泉县| 宜章县| 双辽市| 东乡族自治县| 大荔县| 栖霞市| 城市| 西充县| 南郑县| 开平市| 霍林郭勒市| 历史| 寿宁县| 井研县|