混合程序集不发现本机DLL

时间:2013-07-16 21:59:11

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

我有一个带有原生dll依赖关系的混合模式dll。

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

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

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

因此,解决方案是:

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

2 个答案:

答案 0 :(得分:5)

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

  • 调用SetDllDirectory()将包含DLL的路径添加到Windows将要查看的目录集中。如果外部代码也使用它,则可能会失败。
  • 使用Environment.SetEnvironmentVariable()将路径附加到PATH环境变量。这只会改变进程的PATH副本,因此这是一种合理的方法。在具有达到极限的膨胀路径的计算机上可能会失败。
  • 将Enviroment.CurrentDirectory设置为包含DLL的路径。如果外部代码也与之相符,则可能会失败。
  • 在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ KnownDLLs注册表项中记录安装时每个DLL的路径。
  • 在Windows并排缓存中安装DLL,并使用清单告诉Windows它。这很难做对。

答案 1 :(得分:2)

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

我想可以使用P/invokes来访问C#

中的这些调用
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);