首页 > 后端开发 > C++ > 如何在托管 C# DLL 中成功嵌入和使用非托管 DLL?

如何在托管 C# DLL 中成功嵌入和使用非托管 DLL?

Patricia Arquette
发布: 2024-12-29 07:44:09
原创
360 人浏览过

How Can I Successfully Embed and Use an Unmanaged DLL within a Managed C# DLL?

将非托管 DLL 嵌入到托管 C# DLL 中

将非托管 DLL 嵌入到托管 DLL 中是一种巩固和保护依赖项的有用技术。但是,实现起来可能具有挑战性。

问题:

尝试使用 DllImport 将非托管 DLL 嵌入到托管 DLL 中时,会遇到访问被拒绝的情况错误。

说明:

要将非托管 DLL 嵌入为资源,除了简单地将其添加为项目中的嵌入资源之外,您还需要执行其他步骤。

解决方案:

成功嵌入并在托管 DLL 中使用非托管 DLL:

  1. 提取并加载嵌入式 DLL:

    • 从嵌入式中提取非托管 DLL资源流到临时目录。
    • 使用 LoadLibrary 显式加载提取的 DLL在使用 DllImport 之前。
  2. 使用唯一的临时目录:

    • 为您的每个版本创建一个唯一的临时目录汇编以避免版本
  3. 处理文件复制异常:

    • 尝试将嵌入的 DLL 复制到临时目录时处理异常。如果目录中已存在该文件,您可以忽略该异常。

示例代码:

以下代码代码片段演示了嵌入过程:

// Get a unique temporary directory for this assembly version
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." +
  Assembly.GetExecutingAssembly().GetName().Version.ToString());
if (!Directory.Exists(dirName))
  Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Extract the embedded DLL to the temporary location
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(
  "MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
  using (Stream outFile = File.Create(dllPath))
  {
    CopyBytes(stm, outFile);
  }
}

// Load the extracted DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
登录后复制

以上是如何在托管 C# DLL 中成功嵌入和使用非托管 DLL?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板