2009-10-11 28 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")] 
相关问题