当它们的非托管依赖项发生冲突时,如何使用 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?
当***模块及其子模块之一作为单独版本单独导入时,如何解决冲突的 go 模块依赖关系?