c# - 混合程序集未发现 native DLL

标签 c# c++ interop c++-cli

我有一个具有 native dll 依赖项的混合模式 dll。

我正在使用 Assembly.Load 从 C# exe 加载混合模式 dll。然而,混合模式 dll 的位置不在应用程序 bin 目录中,因此它失败了,因为它只在 bin 中查找 native C++ dll 和 PATH 环境变量中的文件夹。

我认为使用选项/assemblylinkresource 应该可以阻止这种情况并强制在备用目录中找到 native dll 以及已部署的混合模式 dll。事实证明这是不正确的。

有没有一种方法可以使用现有的 C++/CLI 混合模式 dll 创建带有 native dll 的多文件程序集?我见过的唯一示例 ( http://msdn.microsoft.com/en-us/library/xawyf94k(v=vs.100).aspx) 是使用 .netmodules 和 native dll。

因此,解决方案是:

a) 一些如何强制应用程序在您选择的目录中搜索 native 依赖项;或者 b) 将 native dll 打包到一个托管的混合模式程序集中(这甚至可能吗??)- 假定静态链接依赖项不是一种选择。

最佳答案

正常的 Windows DLL 搜索规则适用。所以是的,它永远找不到那些 DLL。 “多文件程序集”也行不通,您无法合并 native 代码。您拥有的选项,大致按首选顺序排列:

  • 调用SetDllDirectory()将包含 DLL 的路径添加到 Windows 将查找的目录集中。如果外部代码也使用它,可能会失败。
  • 使用 Environment.SetEnvironmentVariable() 将路径附加到 PATH 环境变量。这只会更改进程的 PATH 拷贝,因此是一种合理的方法。可能会在 PATH 已达到极限的膨胀机器上失败。
  • 将 Enviroment.CurrentDirectory 设置为包含 DLL 的路径。如果外部代码也对其进行修改,则可能会失败。
  • 在安装时在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 注册表项中记录每个 DLL 的路径。
  • 在 Windows 并行缓存中安装 DLL,并使用 list 将其告知 Windows。这很难做到正确。

关于c# - 混合程序集未发现 native DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17687755/

相关文章:

c# - 为异步调用保存的通用参数在哪里?在哪里可以找到它的名称或其他信息?

c# - 日志语句避免计算参数

c# - 扩展 lambda 表达式

c++ - 标准是否需要 vector 重新分配和 vector::push_back 才能使用 placement new 和复制构造函数?

c++ - libclang 返回太多关于函数声明的信息

c++ - 具有通用类型函数的动态库 [c++]

c++ - 如何在 C++ 中使用 MATLAB 函数 randn?

c# - 使用 Caliburn Micro 从 View 模型中的属性名称获取控制权

c# - Excel 自动化 : Close event missing

java - 如何在 Scala 中使用可变参数方法实现 Java 接口(interface)?