当它们的非托管依赖项发生冲突时,如何使用 2 个第三方 .net 库?

Posted

技术标签:

【中文标题】当它们的非托管依赖项发生冲突时,如何使用 2 个第三方 .net 库?【英文标题】:How to use 2 third party .net libraries when their unmanaged dependencies conflict? 【发布时间】:2011-09-15 15:28:29 【问题描述】:

假设我有一个使用第三方 .net 程序集 B.dll 和第三方 .net 程序集 C.dll 的 .net 程序集 A.dll。

事实证明,B.dll 内部使用非托管程序集 D.dll(版本 1) 而 C.dll 使用非托管程序集 D.dll(版本 2)。

B 和 C 来自不同的供应商,仅使用其正确版本的 D.dll 进行测试。

如何部署 A 以使 B 和 C 正常工作?

编辑:

我认为存在三个不同的问题:

1) 如何从外部控制 B 和 C 寻找 D 的路径。

2) 如何从外部控制 D 用于其自身依赖项的路径。

3) 如何确保进程正确引导函数调用。

我的研究表明,如果没有对所有模块的编译时间控制,这可能是不可能的......

【问题讨论】:

【参考方案1】:

我会尝试通过“探测”配置部分来配置几个 bin 文件夹。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin\B;bin\C"/>
      </assemblyBinding>
   </runtime>
</configuration>

然后我会将 B.dll 及其非托管依赖项放入 bin\B 文件夹,将 C.dll 及其非托管依赖项放入 bin\C 文件夹。

【讨论】:

据我了解,这将重定向以查找 B 和 C,但是这不会自动链接到非托管搜索 D。 @morechilli:据我了解,B 和 C 应该在自己旁边寻找它的依赖关系,所以每个(B 和 C)都应该找到相应的 D 版本 感谢您的帮助 - 您是否有任何描述此行为的链接 - 我没有找到任何关于这种情况的建议。 @morechilli:不,我没有特定的链接。我只是认为 1) 如果程序集通过托管包装器 (Interop.*.dll) 导入 DLL,则程序集使用标准程序集解析逻辑 (msdn.microsoft.com/en-us/library/15hyw9x3(v=VS.71).aspx) 加载包装器,并且包装器应该知道 DLL 的位置; 2) 如果程序集通过 DllImport 属性导入 DLL,则 CLR (PInvoke) 使用另一个 DLL 解析过程。我倾向于相信 PInvoke 试图在程序集旁边找到 DLL。但这只是我的猜测。你试过吗?

以上是关于当它们的非托管依赖项发生冲突时,如何使用 2 个第三方 .net 库?的主要内容,如果未能解决你的问题,请参考以下文章

当所有依赖项都发生变化时使用效果?

当它们包含我创建的工件时,如何指示 maven 自动添加依赖项 jar?

手动检索 Ivy 依赖项作为 sbt 中的本地非托管库

当***模块及其子模块之一作为单独版本单独导入时,如何解决冲突的 go 模块依赖关系?

GIT 中的 Composer 和 composer.lock 和合并冲突

java maven项目中的库版本冲突