首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合程序集未发现本机DLL

混合程序集未发现本机DLL
EN

Stack Overflow用户
提问于 2013-07-17 05:59:11
回答 2查看 1.3K关注 0票数 3

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

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

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

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

因此,解决方案是:

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

EN

回答 2

Stack Overflow用户

发布于 2013-07-17 06:27:03

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

Window

  • 调用SetDllDirectory()将包含DLL的路径添加到将查找的目录组中。如果外部代码也使用它,则可能会失败。
  • 使用Environment.SetEnvironmentVariable()将路径追加到path环境变量。这只会更改进程的路径副本,因此这是一种合理的方法。在路径膨胀达到限制的计算机上可能会失败。
  • 将Enviroment.CurrentDirectory设置为包含DLL的路径。如果外部代码也对其进行了修补,则可能会失败。
  • 在安装时将每个DLL的路径记录在Windows \KnownDLL注册表项中。

并排缓存中安装DLL,并使用清单将其告知。这很难做对。

票数 5
EN

Stack Overflow用户

发布于 2013-07-17 06:22:01

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

我猜人们可以在C#中使用P/invokes访问这些调用

代码语言:javascript
复制
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17687755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档