2017-04-15 57 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=所以我並不感到驚訝。 –