3

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

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

我认为使用选项 /assemblylinkresource 可以阻止此操作并强制在部署的混合模式 dll 旁边的备用目录中找到本机 dll。事实证明这是不正确的。

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

因此,解决方案是:

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

4

2 回答 2

5

正常的 Windows DLL 搜索规则适用。所以是的,没有希望它会找到那些 DLL。“多文件程序集”也不起作用,您无法合并本机代码。您拥有的选项,大致按首选顺序:

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

未使用 MMA 测试的解决方案的潜在候选者:这可能不是您希望的最佳解决方案,但我想我会添加它,因为它可以帮助您实现解决方案 a)。在 c++ 中,您可以通过使用SetDllDirectory手动设置要搜索的目录(仅适用于 XP SP1)或使用LoadLibraryEx手动加载 dll 来控制加载路径和路径搜索顺序

我想可以使用P/invokes在 C# 中访问这些调用

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);
于 2013-07-16T22:22:00.623 回答