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

时间:2009-10-11 09:18:11

标签: c# .net attributes versioninfo

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

  1. 阅读一个DLL的AssemblyVersionAssemblyFileVersion属性值。
  2. 迭代项目中的所有DLL和可执行文件,并将这些版本应用于其AssemblyVersionAssemblyFileVersion属性值。
  3. 现在的问题是:如何执行第2步?

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

    有关此的任何提示吗?

3 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:2)

就我而言,我创建了一个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")]

答案 2 :(得分:1)

如果您有权访问来源,请转到advice from Graviton

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