NuGet包版本不匹配参考版本

时间:2016-05-11 19:46:49

标签: c# nuget version

我一直在调试我的程序问题,我发现我的几个NuGet包的版本与Reference Properties中显示的版本不匹配。例如,查看我安装的NuGet包,我有以下内容:

enter image description here

当我在References组中选择log4net时(在Solution Explorer下),我看到了:

enter image description here

NuGet报告已安装的版本为2.0.5,但Reference报告版本为1.2.15。

有人可以解释为什么会这样,如果这是一个问题?我和Newtonsoft.Json有同样的问题,其中NuGet显示的是8.0.3版本,但是References显示的是8.0.0的版本

1 个答案:

答案 0 :(得分:10)

诀窍在于你在比较不同的东西。

Nuget会向您显示包含包版本号的可用包。这是包裹所有者在nuget spec file中的version字段中声明的内容。在nuget完成将这些外部文件提取到项目之后,此版本没有任何意义或影响。它与包中的确切内容没有任何直接关系。

另一方面,引用属性查看一个dll,并不关心它来自哪个包。显示的版本是在编译期间使用代码中的AssemblyVersionAttribute属性嵌入在DLL 中的版本号。这是在运行时实际用于查找和加载引用逻辑的版本。

通常情况下,如果包版本和dll版本匹配,但是没有硬性规则来强制执行此操作。它会变得棘手,即使它确实如此,因为一个包可能包含许多dll和其他文件,每个文件版本不同。

对于这个具体案例,我没有任何信息,为什么业主已经做出了这种差异,也没有根据他们的版本逻辑。如果没有记录,那么您可以向他们发送消息并询问其含义。

好处是,除了一点混乱之外,如果dll做了你期望它做的事情并通过QA那么包中的版本号差异在实践中无关紧要。

修改 请注意,只有第3个数字的版本号差异对于使用semantic versioning practice的库来说很常见,其中第三个组件凹凸表示不间断的错误修复版本。保持相同AssemblyVersion(例如,对于Newtonsoft.Json为“8.0.0”)允许就地升级,而无需重新编译引用具有相同major-minor的先前版本的所有程序集(8.0.0,8.0.1,8.0) 0.2)。