以编程方式更改AssemblyVersion和AssemblyFileVersion属性

在设置创建过程中,我计划执行以下操作(在C#脚本中 ):

  1. 阅读一个DLL的AssemblyVersionAssemblyFileVersion属性值。
  2. 迭代项目中的所有DLL和可执行文件,并将这些版本应用于其AssemblyVersionAssemblyFileVersion属性值。

现在的问题是: 如何做第2步?

我成功地可以做第1步,但对于第2步,我没有看到真正的起点。 我可能要做的是使用一些本机P / Invoke方法,因为属性直接修改DLL /可执行文件的版本信息资源信息。

有关于此的任何提示吗?

为什么不在构建过程中读取一个DLL的AssemblyVersionAssemblyFileVersion ,并将其保存回其他csproject的AssemblyInfo.cs ,然后才编译它?

事实上,我不知道是否可以直接修改DLL文件,而不需要诉诸一些幻想。

或者,确保所有DLL共享一个通用的AssemblyInfo.cs 。 您可以通过在csproject中添加新项目时将AssemblyInfo.cs添加为“添加为链接”来执行此操作。 这样,当您进行编译时,所有DLL将共享相同的AssemblyInfo.cs ,从而输出相同的AssemblyVersion

在我的例子中,我创建了一个T4模板来更改AssemblyVersion和AssemblyFileVersion。 我调用了模板Assembly.tt,并使其成为一个链接文件(当你添加它时选择Add Link,而不是Add)。 我的所有程序集都会引入链接的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")] 

如果您可以访问来源,请接受Graviton的建议

如果你不这样做,你可能会遇到麻烦。 可能您可以使用ILDASM进行反汇编并使用ILASM重新组装。 但这对于命名强大的程序集来说不会有用。