8

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

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

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

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

对此有任何提示吗?

4

3 回答 3

13

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

事实上,我不知道是否可以直接修改 DLL 文件,而不诉诸于天马行空的东西。

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

于 2009-10-11T09:20:09.217 回答
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")]
于 2016-10-11T17:48:06.170 回答
1

如果您可以访问资源,请听取 Graviton的建议

如果你不这样做,你可能会遇到麻烦。可能您可以使用 ILDASM 拆卸并使用 ILASM 重新组装。但这不适用于强名称程序集。

于 2009-10-11T09:31:25.887 回答