.net - 什么时候必须使用绑定(bind)重定向?

标签 .net msbuild nuget

项目 A 使用 log4net 1.2.13.0,并依赖于库 B,而库 B 使用 log4net 1.2.11.0。如果我执行 Package Manager Console> Add-BindingRedirect,我会在 app.config 中获得正确的绑定(bind)重定向:

  <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 中进行显式重定向有什么优势吗?

此外,据我记得,在某些情况下,您需要添加绑定(bind)重定向。否则应用程序将在运行时崩溃。这些情况是什么?为什么 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 通过“假装存在绑定(bind)重定向”规则解决了这个问题。

最佳答案

版本控制是一个大话题,无法在单个 SO 帖子中正确地表达出来。如此惊人的速度:

当您使用多个 Nuget 包并且它们具有共同的依赖项时,这些恶作剧是必要的。像 log4net 或 NewtonSoft.Json 一样,这些非常常见的库没有将程序集放入 GAC 中的安装程序。

问题是,每个 Nuget 包很可能是使用这些核心支持库的不同版本构建的。而且这样的包不太可能获得足够的更新来保持最新版本,包作者更喜欢他测试代码所用的版本。因此,您很容易在构建目录中得到一个需要 1.2.11.0 的程序集,而另一个需要 1.2.13.0 的程序集

那是行不通的。 CLR 在加载程序集时坚持要求精确版本匹配。并且必须从构建目录加载它,并且不能依赖 GAC 来提供它们。 DLL 只能有一份副本,不可避免地,其中一个包库将获得错误的版本,并且您的程序将崩溃。不好,如果不重建 Nuget 包就无法解决您的问题。

这就是绑定(bind)重定向解决的问题。它仅在运行时产生影响,而在构建时没有影响。它告诉 CLR,“如果它要求 1.2.11.0,则只需加载 1.2.13.0。或者更一般地使用此特定绑定(bind)重定向:“如果它要求任何版本小于 1.2.13.0” .问题解决了,不再崩溃了。祈祷该软件包仍然可以与较新的版本一起使用。当只有修订号不同时,他们很常见。但是没有硬性保证。

需要决定的另一件事(这发生在构建时)是应该选择哪个特定版本的库。您想要 1.2.11.0 还是 1.2.13.0?这就是 AutoUnify 的作用。没什么太复杂的,它选择更高的版本。

关于.net - 什么时候必须使用绑定(bind)重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717340/

相关文章:

.net - ASP.NET Core 2.1 Identity找不到ApplicationUser

c# - 连接子句中的可选条件 - Linq

asp.net-mvc - 如何使用 MSBuild 部署 ASP.NET MVC 应用程序

c# - 加载包含作为通配符的项的 .NET 项目

c# - 发现/查找项目实际用于安装的 Nuget 包的 "packages"目录的物理位置

c# - 我可以伪造 HttpContent.ReadAsAsync<T> 吗?

c# - 一个有恒星、银河系和其他东西的星系 (WPF)

c# - MSBuild 内联任务 - 引用非标准 Microsoft 程序集

javascript - TFS 是否应该在源代码管理中存储通过 NuGet 安装的 JavaScript 包?

Nuget 服务器返回 40 3's and 404' s