什么时候必须使用绑定重定向?
When do I have to use binding redirects?
项目 A 使用 log4net 1.2.13.0
,并依赖于使用 log4net 1.2.11.0
的库 B。如果我这样做 Package Manager Console> 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>
我认为需要才能完成构建。但是在没有重定向的情况下构建也会成功。这是我在构建日志中看到的(详细设置为详细):
Unified primary reference "log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a".
Using this version instead of original version "1.2.11.0" in "C:\Users\vorou\code\ConsoleApplication1\packages\LibraryB.dll" because AutoUnify is 'true'.
AutoUnify 是什么意思?哪个更好,即在 .config 中进行显式重定向是否有任何优势?
此外,据我所知,在某些情况下,您需要 添加绑定重定向。否则应用程序将在运行时崩溃。这些情况是什么?为什么 AutoUnify
魔法对他们不起作用?
UPD 这是 MSDN 关于 AutoUnify
:
的摘录
This parameter is used for building assemblies, such as DLLs, which cannot have a normal App.Config file.
When true, the resulting dependency graph is automatically treated as if there were an App.Config file passed in to the AppConfigFile parameter. This virtual App.Config file has a bindingRedirect entry for each conflicting set of assemblies such that the highest version assembly is chosen. A consequence of this is that there will never be a warning about conflicting assemblies because every conflict will have been resolved.
看起来 .config 中的重定向在我的案例中没有发挥任何作用。问题是库 B 不能满足它的依赖关系,AutoUnify
用“假装有绑定重定向”规则解决了它。
版本控制是一个很大的话题,不能在单个 SO 中做到公正 post。如此惊人的速度:
当您使用多个 Nuget 包并且它们具有共同的依赖性时,这些恶作剧是必要的。像 log4net 或 NewtonSoft.Json 一样,非常常见的库没有将程序集放入 GAC 的安装程序。
问题是,每个 Nuget 包很可能是用这些核心支持库的不同版本构建的。而且这样的包不太可能获得足够的更新来保持最新版本,包作者喜欢他测试代码的版本。因此,您很容易在构建目录中得到一个要求 1.2.11.0 的程序集和另一个要求 1.2.13.0
的程序集
那不行。 CLR 在加载程序集时坚持 exact 版本匹配。并且必须从您的构建目录加载它并且不能依赖 GAC 来提供它们。 DLL 只能有一个副本,不可避免地,其中一个包库将获得错误的版本,您的程序将崩溃。不好,如果不重建 Nuget 包就无法解决问题。
这就是绑定重定向解决的问题。它只在运行时有影响,而不是构建时。它告诉 CLR,"if it asks for 1.2.11.0 then just load 1.2.13.0 instead. Or more generally with this specific binding redirect: "如果它要求 任何 版本小于 1.2.13.0”。问题解决了,不再崩溃了。祈祷这个包仍然适用于更新的版本版本。当只有修订号不同时,他们通常会这样做。但是没有硬性保证。
另一件需要决定的事情,这发生在构建时,是应该选择哪个特定版本的库。你想要 1.2.11.0 还是 1.2.13.0?这就是 AutoUnify 所做的。没有什么很复杂的,它选择了更高版本。
项目 A 使用 log4net 1.2.13.0
,并依赖于使用 log4net 1.2.11.0
的库 B。如果我这样做 Package Manager Console> 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>
我认为需要才能完成构建。但是在没有重定向的情况下构建也会成功。这是我在构建日志中看到的(详细设置为详细):
Unified primary reference "log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a". Using this version instead of original version "1.2.11.0" in "C:\Users\vorou\code\ConsoleApplication1\packages\LibraryB.dll" because AutoUnify is 'true'.
AutoUnify 是什么意思?哪个更好,即在 .config 中进行显式重定向是否有任何优势?
此外,据我所知,在某些情况下,您需要 添加绑定重定向。否则应用程序将在运行时崩溃。这些情况是什么?为什么 AutoUnify
魔法对他们不起作用?
UPD 这是 MSDN 关于 AutoUnify
:
This parameter is used for building assemblies, such as DLLs, which cannot have a normal App.Config file. When true, the resulting dependency graph is automatically treated as if there were an App.Config file passed in to the AppConfigFile parameter. This virtual App.Config file has a bindingRedirect entry for each conflicting set of assemblies such that the highest version assembly is chosen. A consequence of this is that there will never be a warning about conflicting assemblies because every conflict will have been resolved.
看起来 .config 中的重定向在我的案例中没有发挥任何作用。问题是库 B 不能满足它的依赖关系,AutoUnify
用“假装有绑定重定向”规则解决了它。
版本控制是一个很大的话题,不能在单个 SO 中做到公正 post。如此惊人的速度:
当您使用多个 Nuget 包并且它们具有共同的依赖性时,这些恶作剧是必要的。像 log4net 或 NewtonSoft.Json 一样,非常常见的库没有将程序集放入 GAC 的安装程序。
问题是,每个 Nuget 包很可能是用这些核心支持库的不同版本构建的。而且这样的包不太可能获得足够的更新来保持最新版本,包作者喜欢他测试代码的版本。因此,您很容易在构建目录中得到一个要求 1.2.11.0 的程序集和另一个要求 1.2.13.0
的程序集那不行。 CLR 在加载程序集时坚持 exact 版本匹配。并且必须从您的构建目录加载它并且不能依赖 GAC 来提供它们。 DLL 只能有一个副本,不可避免地,其中一个包库将获得错误的版本,您的程序将崩溃。不好,如果不重建 Nuget 包就无法解决问题。
这就是绑定重定向解决的问题。它只在运行时有影响,而不是构建时。它告诉 CLR,"if it asks for 1.2.11.0 then just load 1.2.13.0 instead. Or more generally with this specific binding redirect: "如果它要求 任何 版本小于 1.2.13.0”。问题解决了,不再崩溃了。祈祷这个包仍然适用于更新的版本版本。当只有修订号不同时,他们通常会这样做。但是没有硬性保证。
另一件需要决定的事情,这发生在构建时,是应该选择哪个特定版本的库。你想要 1.2.11.0 还是 1.2.13.0?这就是 AutoUnify 所做的。没有什么很复杂的,它选择了更高版本。