C#加載嵌入到資源的非托管dll
如何加載非托管Dll
我們總會(huì)遇到需要加載非Win32的非托管dll,這里推薦一種方式就是將那些非win32的非托管dll嵌入資源的方式,在入口解壓并且加載的方式,我先來看看如何實(shí)現(xiàn)吧,首先我們準(zhǔn)備好demo,新增控制臺項(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的下常見的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");
}
參考
以上就是C#如何加載嵌入到資源的非托管dll的詳細(xì)內(nèi)容,更多關(guān)于C#資源非托管dll的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#反射在實(shí)際應(yīng)用中的實(shí)例代碼
C#實(shí)現(xiàn)凍結(jié)Excel窗口以鎖定行列或解除凍結(jié)
C#(.Net)將非托管dll嵌入exe中的實(shí)現(xiàn)
C#多線程學(xué)習(xí)之(六)互斥對象用法實(shí)例
C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法

