在一个安装创作过程,我打算做到以下几点(一内C#脚本 ):
- 阅读
AssemblyVersion
和AssemblyFileVersion
属性一个DLL的值。 - 迭代项目中的所有DLL文件和可执行文件,并将这些版本到他们
AssemblyVersion
和AssemblyFileVersion
属性值。
现在的问题是: 如何做第2步?
我成功地可以做的第一步,但对于第2步我没有看到一个真正的起点。 我可能要做的是使用一些天然的P / Invoke方法,因为属性直接修改DLL /可执行文件的版本信息资源的信息。
在这个任何提示?
你为什么不,在构建过程中,阅读AssemblyVersion
和AssemblyFileVersion
一个DLL,并保存回其他csproject的AssemblyInfo.cs
,只有编译它?
作为事实上,我不知道是否有可能直接修改DLL文件,而不是诉诸什么稀奇的。
或替代,确保所有您的dll一个共同AssemblyInfo.cs
。 您可以通过添加为此AssemblyInfo.cs
的“添加链接”,当你在csproject添加新项。 这样,当你做一个编辑,所有的DLL将共享相同AssemblyInfo.cs
,从而输出相同AssemblyVersion
。
就我而言,我创建了一个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")]
如果你有机会获得资源,采取从引力意见
如果不这样做,你可能会遇到麻烦。 也许你可以用ILDASM拆卸与重新组装ILASM。 但是,这不会为强名称程序集锻炼身体。
文章来源: Programmatically change the AssemblyVersion and AssemblyFileVersion attributes