项目A使用log4net 1.2.13.0
,并依赖于Library B,该库使用log4net 1.2.11.0
。如果我执行Package Manager控制台> Add-BindingRedirect
,我会在app.config
中得到正确的绑定重定向:
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.13.0" newVersion="1.2.13.0" />
</dependentAssembly>
我以为这个重定向是构建必要的步骤,但是在没有重定向的情况下也可以成功构建。下面是日志详细信息:
“log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”被统一为主引用。 在“C:\Users\vorou\code\ConsoleApplication1\packages\LibraryB.dll”中使用此版本,而不使用原始版本“1.2.11.0”,因为AutoUnify设置为'true'。
什么是AutoUnify? 显式重定向在.config文件中更好吗?
另外,我记得有些情况下您需要添加绑定重定向,否则应用程序会在运行时崩溃。 这些情况是什么,为什么这种“AutoUnify”魔法对它们无效?
更新 这是来自MSDN的摘录,介绍了AutoUnify
:
此参数用于构建无法拥有正常App.Config文件的程序集,例如DLL。当值为true时,生成的依赖项图像会自动处理为如果将AppConfigFile参数传递给了App.Config文件。这个虚拟的App.Config文件对于每个冲突集合的程序集都有一个bindingRedirect条目,以选择最高版本的程序集。其结果是将不会有关于冲突程序集的警告,因为每个冲突都已经被解决。
看起来在我的情况下,.config文件中的重定向没有任何作用。问题在于Library B不能满足它的依赖关系,并且“AutoUnify”通过那个“假设存在绑定重定向”的规则解决了这个问题。