C#使用PInvoke.Kernel32加载非托管DLL嵌入资源-C/S开发框架

如何加载非托管Dll
我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现吧,首先我们准备好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
其实上述代码还有优化的空间,微软集成了很多win32函数的包,例如我们要导入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#直接使用DllImport外部Dll的方法-C/S开发框架
C#使用Newtonsoft.Json.dll解析Json数据-C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
DLL类库同时支持.NETFramework以及.NETCore(EF模型支持.NET双平台架构)|C/S开发框架
C#.NET7 多线程播放mp3/wav音频|winmm.dll winapi播放音乐文件|C/S开发框架
C#使用QRCodeEncoder生成在线支付二维码图片(中间带Logo)|C/S开发框架
WinFramework添加工程项目Project新建业务模块(DLL库) |C/S开发框架
C# SharpMap的简单使用-C/S开发框架
开发框架使用.NET Reactor(加壳+代码混淆)与加密狗加密有什么区别
CSFramework快速开发框架项目改名VS解决方案改名(使用Rename改名工具)
使用DeepSeek生成DevExpress表格、窗体、C#模型代码并集成到开发框架|C/S开发框架
CSFrameworkV6快速开发框架 | 使用PostgreSql 数据库测试报告|C/S开发框架
使用Photoshop PS制作GIF动画(等待窗体GIF图标)|C/S开发框架
Oracle数据库名称有小数点,使用expdp备份失败:ORA|12154: TNS: 无法解析指定的连接标识符|C/S开发框架
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
达梦数据库使用DmBulkCopy批导数据解决方案|C/S开发框架
C#直接使用DllImport外部Dll的方法-C/S开发框架
C#使用Newtonsoft.Json.dll解析Json数据-C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
DLL类库同时支持.NETFramework以及.NETCore(EF模型支持.NET双平台架构)|C/S开发框架
C#.NET7 多线程播放mp3/wav音频|winmm.dll winapi播放音乐文件|C/S开发框架
C#使用QRCodeEncoder生成在线支付二维码图片(中间带Logo)|C/S开发框架
WinFramework添加工程项目Project新建业务模块(DLL库) |C/S开发框架
C# SharpMap的简单使用-C/S开发框架
开发框架使用.NET Reactor(加壳+代码混淆)与加密狗加密有什么区别
CSFramework快速开发框架项目改名VS解决方案改名(使用Rename改名工具)
使用DeepSeek生成DevExpress表格、窗体、C#模型代码并集成到开发框架|C/S开发框架
CSFrameworkV6快速开发框架 | 使用PostgreSql 数据库测试报告|C/S开发框架
使用Photoshop PS制作GIF动画(等待窗体GIF图标)|C/S开发框架
Oracle数据库名称有小数点,使用expdp备份失败:ORA|12154: TNS: 无法解析指定的连接标识符|C/S开发框架
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
达梦数据库使用DmBulkCopy批导数据解决方案|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
