我一直在调试我的程序问题,我发现我的几个NuGet包的版本与Reference Properties中显示的版本不匹配。例如,查看我安装的NuGet包,我有以下内容:
当我在References组中选择log4net时(在Solution Explorer下),我看到了:
NuGet报告已安装的版本为2.0.5,但Reference报告版本为1.2.15。
有人可以解释为什么会这样,如果这是一个问题?我和Newtonsoft.Json有同样的问题,其中NuGet显示的是8.0.3版本,但是References显示的是8.0.0的版本
答案 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)。