Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 混合程序集未发现本机DLL_C#_C++_Interop_C++ Cli - Fatal编程技术网

C# 混合程序集未发现本机DLL

C# 混合程序集未发现本机DLL,c#,c++,interop,c++-cli,C#,C++,Interop,C++ Cli,我有一个带有本机dll依赖项的混合模式dll 我正在使用Assembly.Load从C#exe加载混合模式dll。但是,混合模式DLL的位置不在应用程序bin目录中,因此它失败,因为它只查找bin中的本机C++ dll和路径环境变量中的文件夹。 我认为使用/assemblylinkresource选项可以停止此操作,并强制在部署的混合模式dll旁边的备用目录中找到本机dll。事实证明这是不正确的 有没有办法使用现有的C++/CLI混合模式dll创建具有本机dll的多文件程序集?我看到的唯一示例(

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

我正在使用Assembly.Load从C#exe加载混合模式dll。但是,混合模式DLL的位置不在应用程序bin目录中,因此它失败,因为它只查找bin中的本机C++ dll和路径环境变量中的文件夹。 我认为使用/assemblylinkresource选项可以停止此操作,并强制在部署的混合模式dll旁边的备用目录中找到本机dll。事实证明这是不正确的

有没有办法使用现有的C++/CLI混合模式dll创建具有本机dll的多文件程序集?我看到的唯一示例()是使用.netmodules与本机dll耦合

因此,解决方案是:

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

可能是一个解决方案的候选方案,未使用MMA进行测试:这可能不是您希望的最佳解决方案,但我想我会添加它,因为它可以帮助您实现解决方案a)。在C++中,您可以控制加载路径,或者手动设置要使用的搜索目录(只能从XP SP1获得),或者手动使用.< /P>手动加载DLL。 我想人们可以用C语言访问这些调用#


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

  • 调用将包含DLL的路径添加到Windows将要查看的目录集中。如果外部代码也使用它,则可能会失败
  • 使用Environment.SetEnvironmentVariable()将路径附加到path环境变量。这只会更改进程的路径副本,因此是一种合理的方法。可能在路径已达到限制的膨胀计算机上发生故障
  • 将Environment.CurrentDirectory设置为具有DLL的路径。如果外部代码也对其进行修补,则可能会失败
  • 在HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLS注册表项中记录安装时每个DLL的路径
  • 在Windows并行缓存中安装DLL,并使用清单告知Windows。这很难做到正确

这可能有效。因此,我正在使用Ninject进行后期绑定-所以我所要做的就是在执行
\u内核之前调用
setdldirectory
。获取
?我认为您在编辑中提供的链接无法处理本机dll依赖项。@Seth:试试看,我认为在进入p/invoke调用之前,
setdldirectory
LoadLibrary
应该可以工作。@Seth:对不起,我觉得我的解决方案有点老套和不确定,于是开始寻找更好的解决方案(错过了该链接不适用于本机DLL;现在将其删除)@BenVoigt指的是一个已经被删除的链接。非常感谢!在您的第一个解决方案中,“如果外部代码也使用它,则可能会失败”是什么意思?SetDllDirectory doco声明“向用于查找应用程序DLL的搜索路径添加一个目录”。因此,即使外部代码使用它,它也会向搜索添加一个额外的路径吗?感谢第四个解决方案。但是,在我们的特定情况下,这不是一个选项,因为它是一个bootstrap应用程序,并且在安装bootstr应用程序时,实现是未知的(dll依赖项)。不,如文档所述:“每次调用SetDllDirectory函数时,它都会替换上一次SetDllDirectory调用中指定的目录。”AddDllDirectory()更好,但这是一个很晚才添加到Windows中的选项。我想如果存在PATH环境变量膨胀,我将使用选项2并回退到选项1。
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);