我有一个带有原生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打包到一个托管混合模式程序集中(这是否可能?) - 给定静态链接依赖项不是一种选择。
答案 0 :(得分:5)
正常的Windows DLL搜索规则适用。所以是的,没有希望它会找到那些DLL。 “多文件程序集”也不起作用,您无法合并本机代码。您拥有的选项,大致按首选顺序排列:
答案 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);