环境
对于我们的应用程序和实用程序,我们尝试将我们对所有工具的所有(开源)库依赖项标准化为相同版本;我们不断构建所有工具以确保一切正常。
问题
碰巧我们必须使用封闭源代码的第 3 方 .NET 库程序集。其中一些程序集对开源组件有自己的传递依赖。如果我们碰巧使用相同的开源组件,很可能我们使用的版本与封闭源依赖项不同,因此我们会发生冲突。
问题示例
只是一个例子!
我们的程序集our_abc.dll
使用了一个封闭源代码的第三方程序集their_xyz.dll
,它引用Newtonsoft.Json.dll
了与我们不同的版本。
在这种情况下,在 our_abc 和 their_xyz 之间的“API 表面”上不使用 json 类型,这种情况似乎很常见。
解决方案?
所以,我们想要实现的是我们的代码只使用它需要的版本的开源程序集,而我们引用的封闭源第 3 方程序集应该只使用他们的版本。
理想情况下,这应该通过尽可能少的配置文件恶作剧来实现。对于相当多的部署,使用 GAC 似乎相当笨拙。
我已经阅读过assemblyBinding
,但我不确定它是否适合这项工作,因为似乎我们需要手动维护所有应用程序的 app.config 文件中的所有传递依赖项才能正常工作:
链接中的解决方案使其看起来如下所示。鉴于这种依赖情况:
tool.exe -> my_abc.dll -> their_xyz.dll -> opensource.dll[v6]
\ ||
\ \/
\-> opensource.dll[v11]
...我知道我可以准备一个app.config
文件,tool.exe
指定在哪里查找 2 ( n
) 个不同版本的传递依赖项。
但是,从可维护性 POV 来看,如果我可以将信息与their_xyz
“包”捆绑在一起会更好,这样tool.exe
就不必知道它的传递依赖关系。这有可能吗?