混合程序集未发现本机DLL

本文关键字:DLL 本机 未发现 程序集 混合 | 更新日期: 2023-09-27 18:23:42

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

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

我认为使用/assemblyinkresource选项可以停止这种情况,并强制在部署的混合模式dll旁边的备用目录中找到本机dll。事实证明这是不正确的。

有没有一种方法可以使用现有的C++/CLI混合模式dll创建具有本机dll的多文件程序集?唯一的例子(http://msdn.microsoft.com/en-us/library/xawyf94k(v=vs.100).aspx)我看到使用的是与本机dll耦合的.netmodule。

因此,解决方案是:

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

混合程序集未发现本机DLL

适用普通的Windows DLL搜索规则。所以,是的,它不可能找到那些DLL。"多文件程序集"也不起作用,不能合并本机代码。您的选项,大致按首选顺序排列:

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

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

我想可以使用p/调用来访问C#中的这些调用

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);