dll版本-AssemblyVersion, AssemblyFileVersion, AssemblyInformationalVersion?

  • 1337
  • 0
  • 2018-07-29

關於dll發布後的版本資訊:

AssemblyVersion, AssemblyFileVersion, AssemblyInformationalVersion的小細節, 將網路上看到的文章做個筆記。

 

偶爾會遇到類似以下的錯誤訊息

[image%5B5%5D]基本上要解決這個問題就是透過在config(Web.config/ App.config)設定bindingRedirect

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
   <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
 </dependentAssembly>
</assemblyBinding>

[說明]

  • assemblyIdentity設定對應哪個dll, 另外publicKeyToken可以用powershell取得, 指令如下:

 ([system.reflection.assembly]::loadfile("D:\Mine\MVC練習\EF6-Code-First-Demo\EF6CodeFirstDemo\bin\Debu
g\Newtonsoft.Json.dll"
)).FullName

黃字的部分換成對應的路徑, 結果會如下圖

  • bindingRedirect設定版號對應
  1. oldVersion - 那些版號要對應 - 可以用 - 來包含版號區間。
  2. newVersion - 在oldVersion符合的版號要對應到那個版號

[解決方法]

讓visual studio自動binding, 分為console專案和web專案不同

console專案

step 1. 先卸載專案

step 2. 編輯 .csprojstep 3. 手動加入AutoGenerateBindingRedirectsPropertyGroup

4. 重新建置專案

p.s 若target版本為.net framework 4.5.2之後會自動有加上此設定

web專案

和console不同,VS不會自動調整Web.config,但是VS會有提示。 建置完檢查warning....

image

可以直接對warning點兩下,會自動問說要不要加入,如果要加入,會自動修改Web.config

image

 

前述所提及的bindingRedirect設定的oldVersion / newVersion的版號到底是從何出來?

則必須從專案中 AssemblyInfo.cs 這個檔案的這個屬性

[assembly: AssemblyVersion("1.0.*")]

若設定為此則會自動跳號, 即為下圖34行的地方, 跳號規則詳見黑暗大文章 http://blog.darkthread.net/post-2008-07-29-about-asm-version.aspx#12078

  1. AssemblyVersion

    為必要屬性,是參照組件的重要依據,一旦版號改變,參照該組件的程式必須更新(重新編譯或設定組件繫結重新導向)。
  2. AssemblyFileVersion

    主要用於部署管理,可以每次部署時遞增以便區隔,是安裝程式常用的版本依據,實務上可由MSBuild產生(但要自己寫邏輯)。如果想不驚動相關程式悄悄換版,可以維持同一個AssemblyVersion,只編譯成AssemblyFileVersion不同的DLL檔。若未指定AssemblyFileVersion,系統會用AssemblyVersion版號當作AssemblyFileVersion。 AssemblyFileVersion可以用檔案總管檢視(即前面附圖所示的「檔案版本」)。 
  3. AssemblyInformationalVersion

    產品版本。它不像AssemblyVersion跟AssemblyFileVersion限定格式為四節數字,允許寫成"0.9 Beta Version"、"1.0 Release Candidate"之類的可讀文字,但過去曾出現過相關工具處理非數字AssemblyInformationalVersion的相容問題(例:Issue1Issue2)。當組件未指定AssemblyInformationalVersion時,系統會使用AssemblyVersion代替。

引用參考: 

http://blog.alantsai.net/posts/2017/10/donet-dll-hell-problem-how-to-use-bindingredirect#WizKMOutline_1509380152602192

http://blog.darkthread.net/post-2008-07-29-about-asm-version.aspx#12078

http://blog.darkthread.net/post-2015-11-25-assemblyinformationversion.aspx