如何编写在升级包引用时更新绑定重定向的NuGet包?
我们使用VS2017,并以旧的方式使用NuGet软件包。到目前为止,我们没有使用PackageReference 当通过VS中的NuGet管理器更新NuGet包引用时,相应的程序集绑定重定向不会自动更新-我们必须手动执行 因此,我想由软件包通过tools\install.ps1脚本来处理它。现在,我想我知道如何实现它,但我不想发明轮子。当然,代码已经存在于某个地方,但是在哪里呢 澄清 我们的应用程序经过了强力签名,目前的目标是.NET 4.5.2(很快将升级到4.7.2)。我们使用packages.config 我需要解释发生了什么事。场上有三名球员:如何编写在升级包引用时更新绑定重定向的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
如果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的v2dotnet new classlib-n anotherLib
,并将签名密钥设置为snk.snk
。将Class1.cs更改为AnotherClass
,并添加了一个属性publicstringmessage=>newsomelib.SomeClass().Message代码>。在csproj中添加了对someLib版本1的引用,然后构建、打包并使用nuget.exe将nupkg添加到localFeed
anotherLib
的引用,它会自动引入someLib
的v1。将someLib
的引用升级到v2,并确认packages.config
现在对someLib
具有绑定重定向PackageReference
,而不是packages.config
。project app.config没有绑定重定向,但生成后bin文件夹中的.config文件有绑定重定向someLib
的所有程序集都引用同一版本。只有通过使我的控制台应用程序引用与另一个库使用的不同版本的someLib
,才能创建绑定重定向
在带有插件的应用程序中,构建应用程序集不会有绑定重定向,因为它是编译命令行中唯一使用插件契约dll的程序集,因此不需要绑定重定向。构建插件程序集时,只有插件依赖于插件契约dll,因此同样没有冲突,因此没有绑定重定向。如果将所有DLL复制到单个文件夹中,则所需版本中可能存在冲突,但这是部署时问题,而不是生成/编译时问题,因此生成工具可能没有帮助。解决这个问题的一种方法是从应用程序集中添加对插件项目的引用。通过这种方式,编译时构建工具可以看到使用了两个不同版本的插件契约dll,因此可以使用绑定重定向