C#加載嵌入到資源的非托管dll
如何加載非托管Dll
我們總會遇到需要加載非Win32的非托管dll,這里推薦一種方式就是將那些非win32的非托管dll嵌入資源的方式,在入口解壓并且加載的方式,我先來看看如何實現(xià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);//應該每次都加載非托管 } /// <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ù)的包,例如我們要導入win32的下常見的kernel32
dll和user32
dll,我們可以通過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"); }
參考
以上就是C#如何加載嵌入到資源的非托管dll的詳細內容,更多關于C#資源非托管dll的資料請關注腳本之家其它相關文章!
相關文章
C#(.Net)將非托管dll嵌入exe中的實現(xiàn)
本文主要介紹了C#(.Net)將非托管dll嵌入exe中的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12C# 6.0 內插字符串(Interpolated Strings )的使用方法
這篇文章主要為大家詳細介紹了C# 6.0 內插字符串的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11