【问题标题】:Where does the Nuget Get-Project -All | Add-BindingRedirect get its version numbers?Nuget Get-Project -All | 在哪里? Add-BindingRedirect 得到它的版本号?
【发布时间】:2023-03-27 10:03:01
【问题描述】:

我正在尝试将我的解决方案中的所有 DLL 版本与许多项目同步。我注意到我的 app.config 包含几个程序集绑定重定向,如下所示:

  <dependentAssembly>
    <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.2.1" newVersion="4.0.2.1" />
  </dependentAssembly>

但是,我可以通过 NuGet 包管理器告诉我,没有需要合并的包,所有项目都指向该程序集的 4.4.1 版

我尝试遵循this blog post 的建议。我删除了所有绑定重定向并尝试通过以下方式重新生成:

获取项目-全部 |添加绑定重定向

根据NuGet DocumentationAdd-BindingRedirect应该检查项目的输出路径。我假设这意味着 bin 文件夹。

但在清理和重建Get-Project -All | Add-BindingRedirect 后,我的app.config 中仍然会产生相同的重定向。

NuGet Get-Project -All | Add-BindingRedirect 从哪里获得其版本号?

这些不正确的 NuGet 包版本可能来自哪里?

【问题讨论】:

  • 版本号不是来自给定 NuGet 包引用的 DLL 吗?如果您安装了包含 1.2.3.4 版本的 A.dll 的 A.nupkg,那么如果添加了重定向的程序集绑定,它将是 1.2.3.4。
  • 我有一个使用 [System.ComponentModel.Annotations, 4.5.0] 的 netstandard 项目和一个使用来自同一程序集的 4.2.1 的 [NET Framework 4.7.2] UnitTest 项目。即使为单元测试项目安装了 netstandard 包(这是测试组件所必需的),绑定重定向也会使用 NET 框架版本而不是 packages.config 中包含的版本进行刷新。因此,在绑定重定向自动更新时,似乎没有考虑到 nuget 包。

标签: c# .net visual-studio web-config app-config


【解决方案1】:

是的,Add-BindingRedirect 会在配置文件中添加&lt;assemblyBinding&gt; 标签,即使在清除了输出文件夹中的所有文件后(似乎文档在这方面并不准确!!)。

显然Add-BindingRedirect 会扫描所有引用的 DLL 及其所有依赖项,如果它在整个依赖项树中发现任何冲突,它会生成所需的 assemblyBindings。

示例

如果您有一个名为“MyProject”的 csproj,它引用了两个 DLL(来自两个不同的 Nuget 包)

  1. SomePackage.dll
  2. AnotherPackage.dll

并且两个 DLL 都引用了BasePackage.dll,但它们中的每一个都引用了不同版本的BasePackage.dll,例如:

  1. SomePackage.dll 引用 BasePackage.dll 版本 1。
  2. AnotherPackage.dll 参考 BasePackage.dll 第 2 版。

当您运行Add-BindingRedirect 命令时,它会扫描“MyProject”引用的所有DLL,并在BasePackage 引用中发现此冲突,然后将类似内容添加到您的配置文件中。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="BasePackage" publicKeyToken="50bd4fe62226aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
</assemblyBinding>

【讨论】:

    【解决方案2】:

    看看这篇文章

    从 Visual Studio 2013 开始,面向 .NET Framework 4.5.1 的新桌面应用程序使用自动绑定重定向。这意味着,如果两个组件引用同一个强名称程序集的不同版本,运行时会自动在输出应用程序配置 (app.config) 文件中将绑定重定向添加到该程序集的较新版本。此重定向会覆盖否则可能发生的程序集统一。源 app.config 文件未修改。例如,假设您的应用直接引用了带外 .NET Framework 组件,但使用了针对同一组件的旧版本的第三方库。编译应用程序时,输出应用程序配置文件被修改为包含到组件的较新版本的绑定重定向。如果您创建 Web 应用程序,您会收到有关绑定冲突的构建警告,这反过来又让您可以选择将必要的绑定重定向添加到源 Web 配置文件。

    来源:Click Here to Read More about Binding Information

    【讨论】:

    • 问题是NuGet Add-BindingRedirect 从哪里得到它的信息。有时,NuGet 会添加 Visual Studio 抱怨的绑定重定向,但它不会,例如,如果项目被卸载。我引用的项目之一使用旧版本的 System.Collections.Immutable,如果在 Visual Studio 中卸载了该项目,NuGet 的 Add-BindingRedirect 将不会添加重定向,即使 Visual Studio 的构建警告应该添加它。如果我加载该项目的负载,则 NuGet 能够检测到丢失的重定向。那么 NuGet 从哪里获取它的依赖信息呢?
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多