2009-10-11 56 views
6

在一個安裝創作過程,我打算做以下(內C# Script):編程方式更改的AssemblyVersion和屬性的AssemblyFileVersion

  1. 閱讀一個DLL的AssemblyVersionAssemblyFileVersion屬性值。
  2. 迭代項目中的所有DLL文件和可執行文件,並將這些版本的AssemblyVersionAssemblyFileVersion屬性值。

問題現在是:如何做第2步?

我成功可以做第1步,但對於第2步我沒有看到一個真正的起點。我可能需要做的是使用一些原生的P/Invoke方法,因爲這些屬性直接修改DLL /可執行文件的版本信息資源信息。

對此有何暗示?

感謝, 烏韋

回答

13

你爲什麼不,在構建過程中,讀出一個DLL的AssemblyVersionAssemblyFileVersion,並保存回其他csproject的AssemblyInfo.cs,只有編譯它?

由於事實上,我不知道是否有可能直接修改DLL文件,而不是訴諸什麼稀奇的。

或者,請確保您所有的DLL文件共享一個共同的AssemblyInfo.cs。在csproject中添加新項目時,可以通過將AssemblyInfo.cs添加爲「添加爲鏈接」來完成此操作。通過這種方式,當您編譯時,所有DLL將共享相同的AssemblyInfo.cs,並因此輸出相同的AssemblyVersion

+1

是的,這是** **得多容易!在構建時直接設置版本號,例如使用持續集成構建服務器 – 2009-10-11 09:45:27

+1

這將是正確的方式,更改編譯文件打破代碼和二進制文件之間的乾淨信息行。 – 2009-10-11 09:53:47

+0

非常感謝,我喜歡共享AssemblyInfo.cs文件的想法! – 2009-10-11 10:32:07

1

如果你有訪問來源,採取advice from Graviton

如果你不這樣做,你可能會遇到麻煩。可能您可以使用ILDASM進行反彙編,並使用ILASM進行重新組合。但是這對於強命名的程序集並不適用。

2

就我而言,我創建了一個T4模板改變的AssemblyVersion和的AssemblyFileVersion。我調用了Assembly.tt模板,並將其作爲一個鏈接文件(當您添加它時選擇添加鏈接,而不是添加)。我所有的程序集都拉入鏈接的Assembly.tt文件。

然後,您可以從一個位置運行T4模板,它會更新所有的AssemblyVersion和AssemblyFileVersions。您不必調用AssemblyInfo.cs文件以將信息拖入您的dll。

爲Assembly.tt文件的代碼是:

<#@ template language="C#" hostspecific="true" #> 
// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
<#+ 
    int RevisionYear = DateTime.UtcNow.Year; 
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays; 
    int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes; 
#> 

的T4模板的輸出結果爲:

// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.2016.284.1066")] 
[assembly: AssemblyFileVersion("4.2016.284.1066")] 
相關問題