如何编写在升级包引用时更新绑定重定向的NuGet包?

如何编写在升级包引用时更新绑定重定向的NuGet包?,nuget,assembly-binding-redirect,Nuget,Assembly Binding Redirect,我们使用VS2017,并以旧的方式使用NuGet软件包。到目前为止,我们没有使用PackageReference 当通过VS中的NuGet管理器更新NuGet包引用时,相应的程序集绑定重定向不会自动更新-我们必须手动执行 因此,我想由软件包通过tools\install.ps1脚本来处理它。现在,我想我知道如何实现它,但我不想发明轮子。当然,代码已经存在于某个地方,但是在哪里呢 澄清 我们的应用程序经过了强力签名,目前的目标是.NET 4.5.2(很快将升级到4.7.2)。我们使用package

我们使用VS2017,并以旧的方式使用NuGet软件包。到目前为止,我们没有使用PackageReference

当通过VS中的NuGet管理器更新NuGet包引用时,相应的程序集绑定重定向不会自动更新-我们必须手动执行

因此,我想由软件包通过tools\install.ps1脚本来处理它。现在,我想我知道如何实现它,但我不想发明轮子。当然,代码已经存在于某个地方,但是在哪里呢

澄清

我们的应用程序经过了强力签名,目前的目标是.NET 4.5.2(很快将升级到4.7.2)。我们使用packages.config

我需要解释发生了什么事。场上有三名球员:

  • 工具升级
  • 工具插件Api-DbUpgradeApi
  • 插件Api的一个实现——LogDbUpgradeProgress
  • 让我们检查DbUpgradeApi包。3个版本与我们相关:

  • 编译LogDbUpgradeProgress所依据的版本-A
  • 编译DbUpgrade所依据的版本-B
  • DbUpgradeApi的最新版本-C
  • DbUpgrade工具在运行时加载插件LogDbUpgradeProgress。需要绑定重定向,因为AB不同(而且由于代码已签名,目前无需执行任何操作)


    如果C高于B,那么我们应该在DbUpgrade中更新对DbUpgradeApi的引用。但这样做必须伴随着更新绑定重定向。这就是这个问题的本质。

    OK,所以我只花了最后一个小时的测试,我不需要做任何我认为特别的事情。 但首先,您确定需要绑定重定向吗。NetCore不需要它。如果您使用的是.NET Framework,但项目使用的是PackageReference,那么它会在生成时解析,您的app.config不需要在代码签入的版本中进行绑定重定向,但在生成并检查[your exe name].config文件时,它确实具有绑定重定向。此外,绑定重定向仅在程序集具有强命名时才起作用。如果未对程序集进行签名,则不需要绑定重定向

    下面是我使用packages.config在控制台应用程序中创建获取绑定重定向复制的步骤

  • 首先创建一个空文件夹。我使用了
    dotnet new sln
    dotnet nugetconfig
    来生成一个新的sln和nuget.config文件。我编辑了nuget.config文件以添加文件夹
    localFeed
    作为源,并将
    globalPackagesFolder
    设置为
    gpf
    ,这样我就不会用测试包污染我真正的全局包文件夹。还使用
    sn-k snk.snk
    创建了一个强名称键
  • 创建第一个测试类库
    dotnet新类库-n someLib
    。我编辑了
    Class1.cs
    将类名更改为
    SomeClass
    ,并添加了一个返回值“Version 1”的属性。使用Visual Studio将
    snk.snk
    设置为签名密钥
    dotnet包
    生成包的V1。然后我编辑了
    SomeClass
    ,将消息更改为“版本2”,然后运行
    dotnetpack/p:Version=2.0.0
    。最后,使用
    nuget.exe add-source localFeed someLib\bin\Debug\someLib.1.0.0.nupkg
    并再次用于nupkg的v2
  • 创建第二个测试类库,
    dotnet new classlib-n anotherLib
    ,并将签名密钥设置为
    snk.snk
    。将Class1.cs更改为
    AnotherClass
    ,并添加了一个属性
    publicstringmessage=>newsomelib.SomeClass().Message。在csproj中添加了对someLib版本1的引用,然后构建、打包并使用nuget.exe将nupkg添加到localFeed
  • 打开Visual Studio并创建了.NET Framework控制台应用程序。添加了对
    anotherLib
    的引用,它会自动引入
    someLib
    的v1。将
    someLib
    的引用升级到v2,并确认
    packages.config
    现在对
    someLib
    具有绑定重定向
  • 创建了另一个.NET Framework控制台应用程序,并执行了与步骤3相同的操作,但这次使用的是
    PackageReference
    ,而不是
    packages.config
    。project app.config没有绑定重定向,但生成后bin文件夹中的.config文件有绑定重定向
  • 编辑:理解NuGet/MSBuild绑定重定向行为的一个重要部分可能是:在步骤3和步骤4中,如果我只添加对另一个库的引用,那么就不会创建绑定重定向,因为引用
    someLib
    的所有程序集都引用同一版本。只有通过使我的控制台应用程序引用与另一个库使用的不同版本的
    someLib
    ,才能创建绑定重定向

    在带有插件的应用程序中,构建应用程序集不会有绑定重定向,因为它是编译命令行中唯一使用插件契约dll的程序集,因此不需要绑定重定向。构建插件程序集时,只有插件依赖于插件契约dll,因此同样没有冲突,因此没有绑定重定向。如果将所有DLL复制到单个文件夹中,则所需版本中可能存在冲突,但这是部署时问题,而不是生成/编译时问题,因此生成工具可能没有帮助。解决这个问题的一种方法是从应用程序集中添加对插件项目的引用。通过这种方式,编译时构建工具可以看到使用了两个不同版本的插件契约dll,因此可以使用绑定重定向