在设置创建过程中,我计划执行以下操作(在C# Script内):
AssemblyVersion
和AssemblyFileVersion
属性值。AssemblyVersion
和AssemblyFileVersion
属性值。现在的问题是:如何执行第2步?
我成功地可以执行第1步,但是对于第2步,我没有看到真正的起点。我可能要做的是使用一些本机P / Invoke方法,因为属性直接修改DLL /可执行文件的版本信息资源信息。
有关此的任何提示吗?
答案 0 :(得分:13)
为什么不在构建过程中读取一个DLL的AssemblyVersion
和AssemblyFileVersion
,并将其保存回其他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重新组装。但是对于命名强大的程序集来说这不会有用。