混合程序集未发现本机DLL
Mixed Assembly Not Discovering Native DLLs
我有一个带有本机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打包到一个托管混合模式程序集中(这可能吗??)-给定静态链接依赖项不是一个选项。
适用普通的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);
相关文章:
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何告诉本机节点模块所需的dll存储在哪里?
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- C++/CLI 混合托管/本机 DLL 不起作用
- 用于LabView中使用的本机c++的c++/cli dll包装器
- 可以从本机代码(如C++/Delphi)中使用.netCore DLL
- 如何在 windowsservercore Docker 映像上安装执行本机C++ DLL/EXE 所需的所有依赖二进制
- 努力使用 C# 从本机 DLL 调用该方法
- 本机 dll 中的动态内存分配
- 本机 dll 从 c# 中踢出,没有错误消息
- 防止本机C++DLL崩溃C#应用
- Unity 如何使用本机 dll 或转换为托管
- 将本机非托管的C DLL加载到托管的C#应用中,导致DLL输出垃圾
- 附加到 C++/CLI dll 的性能探查器无法访问本机C++代码
- clr 如何使用本机 c++ dll 的引用'&'参数调用函数?
- Excel 2016 VSTO 加载项与本机代码 DLL
- 当我将 c++ DLL(我从 c# 调用)重新生成为 /CLR(最初是本机)时,性能下降了一半
- C#访问本机C DLL
- 从C#调用Advapi32.dll本机EventWrite函数
- 如何保留我的unity3d程序(c#v3.5),即使c ++ dll /本机插件中有exit(1)