2017-04-15 48 views
0

我编译了一个针对不同框架(4.0和4.5)的同一个程序集。引用程序集版本的含义是什么?为什么4.0.0.0?

你可以看到他们在dotPeek

dotPeek and two assemblies

我期望的,他们应该引用不同的架构库(mscorlib程序,System.Core程序等),但我错了。他们都引用相同的“版本= 4.0.0.0”。

这是否意味着内存中的.NET CLR加载应用程序将忽略这些版本号(4.0.0.0),但会“推送最新的可用版本”? D

还有CLR(我认为loader是它的一部分)忽略目标框架信息?我的意思是如果CLR加载程序插入版本,它不需要使用目标信息...

或者我的编译过程和msbuild配置有问题吗?

回答

1

它更多的是将程序集版本号(不是文件版本号)粘贴到CLR版本(.NET Framework 1.x/2.0/4.0),而有时是Framework版本(3.5)的Microsoft约定。一个好处是,通过阅读该版本号,您可以立即知道您是否添加了正确的参考。

您的期望并不奇怪,但这只与文件版本号有关,文件版本号根据您的需要显着不同(甚至修补程序可以更改它们)。 Windows使用这种方式来跟踪修补程序级别。

微软决定保持程序集版本号不变(就地升级),所以我们也应该习惯这一点。 CLR着重于程序集版本号,并且在很多情况下忽略文件版本号。

更新:您应该注意到自从.NET Core引入后,该约定开始发生一些变化。现在汇编版本号用于明确指示API表面,并且可以快速更改。

+0

谢谢。这是否意味着将NET40和NET45编译的程序集添加到同一个NUGET包是没有意义的?例如,NLog 4包含40和45(它也包含35,mono10,sl4,sl5,wp8,xamarin.iOS10 - 但我看到了这个意义)。 –

+1

对于很多图书馆(比如我维护的),不需要同时发布net40和net45二进制文件。但是,.NET Framework 4.5的特殊功能可能会影响库,https://github.com/NLog/NLog/search?utf8=%E2%9C%93&q=%22NET4_5%22&type=所以我并不感到惊讶。 –

相关问题