C# 针对强名称程序集的非特定版本构建

C# build against non specific version of strong-named assembly

根据 MSDN:

When you build a .NET Framework application against a specific version of a strong-named assembly, the application uses that version of the assembly at run time.

https://msdn.microsoft.com/en-us/library/7wd6ex19(v=VS.100).aspx

问题

有没有一种方法可以针对强名称程序集构建 .Net Framework 应用程序,以便在 运行 时不需要特定版本? MSDN 的引述似乎暗示 ("against a specific version of a strong-named assembly")

但如何做到这一点。如何针对强命名程序集的非特定版本进行构建? 我所做的所有测试都告诉我,如果我针对强命名程序集构建,它将始终在 运行 时需要该版本。 除非我使用发布者策略或程序集重定向。

更新:

但是当我检查这个 nuget 包时:

https://www.nuget.org/packages/Microsoft.Owin.Security.OAuth.

它说它接受 Newtonsoft.Json 大于 6.0.4 的版本。 我想了解他们是如何做到的?因为 Newtonsoft.Json 是一个强命名程序集。而且我没有看到任何程序集重定向,而且我认为也没有发布者政策。还是我错过了什么?

正如您已经提到的,这是由程序集重定向处理的。

数据包管理器本身的 NuGet 依赖管理,而不是程序集引用。您仍然对项目中的引用具有严格的绑定,当您像往常一样在同一 AppDomain 中得到同一程序集的两个版本时,这可能会导致冲突。 NuGet 甚至不尝试解决问题。

当冲突出现时,您又回到了原点——您需要添加绑定重定向。如果那不可能(例如,对于不兼容版本的程序集),您将获得很多乐趣

NuGet 用于选择库的最佳版本的策略非常简单:获取尽可能低的主要 + 次要版本,以及尽可能高的补丁版本(第三个版本号)。同样,这只发生在更新包时,而不是在编译时或运行时。当您有多个具有不同要求的包时,这允许 NuGet 选择依赖项的兼容版本。但是,它不是可传递的——只有当您的所有引用都在同一个项目中时它才有用。如果您引用的项目是 NuGet 的不同版本的依赖项,那么您又回到了最初的问题。