如何加载非托管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");
}

参考

https://wzd1995.gitee.io/foo/post/C-%E5%8A%A0%E8%BD%BD%E9%9D%9E%E6%89%98%E7%AE%A1dll.html

最新文章

  1. opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较
  2. PMP备考_第五章_项目范围管理_实践思考
  3. Spring整理
  4. 原始感知机入门——python3实现
  5. 批处理命令——for
  6. 团队开发——冲刺1.g
  7. CoreAnimation动画(CALayer动画)
  8. JavaScript/jQuery 表单美化插件小结
  9. 眼见为实(1):C++基本概念在编译器中的实现
  10. UVALIVE 3026 Period
  11. [wikioi]二叉树最大宽度和高度
  12. 迷你MVVM框架 avalonjs 0.85发布
  13. 老李秘技:loadrunner回放脚本错误提示Error: &quot;HTTP Status-Code 500&quot;
  14. React UI 组件库uiw v1.2.8 发布
  15. Postman用法简介
  16. 程序守护服务 Supervisor
  17. 利用git提交代码
  18. iis发布----在XP中发布高版本web遇到问题总结
  19. Angular Forms - 自定义 ngModel 绑定值的方式
  20. c++ STL中的set和multiset

热门文章

  1. Codeforces Round #541 F. Asya And Kittens
  2. P1028_数的计算(JAVA语言)
  3. Java之常用API
  4. HTML5-本地存储浅谈
  5. [shell脚本]在Linux终端可视化输出表格数据
  6. HMS Toolkit自动化环境配置,助您高效集成HMS Core
  7. Node.js/Vue.js使用jsSHA库进行SHA1/2/3加密
  8. C++ sort()函数使用简介
  9. 记一次 医院.NET公众号系统 线程CPU双高分析
  10. 这种ERP系统核查工作实际是在做无用功