在设置创建过程中,我计划执行以下操作(在C#脚本中):
AssemblyVersion和AssemblyFileVersion属性值。AssemblyVersion和AssemblyFileVersion属性值。现在的问题是:如何做第2步?
我可以成功地完成步骤1,但是对于步骤2,我看不到真正的起点。我可能要做的是使用一些本机P/Invoke方法,因为这些属性直接修改DLL/可执行文件的版本信息资源信息。
有什么线索吗?
发布于 2009-10-11 09:20:09
为什么不在构建过程中读取一个DLL的AssemblyVersion和AssemblyFileVersion,并将其保存回其他csproject的AssemblyInfo.cs,然后编译它呢?
事实上,我不知道是否有可能直接修改DLL文件,而不求助于一些奇怪的东西。
或者,确保您的所有DLL共享一个公共的AssemblyInfo.cs。您可以通过在csproject中添加一个新项时将AssemblyInfo.cs添加为“adding”来做到这一点。这样,当您进行编译时,所有DLL都将共享相同的AssemblyInfo.cs,从而输出相同的AssemblyVersion。
发布于 2016-10-11 17:48:06
在我的例子中,我创建了一个T4模板来更改AssemblyVersion和AssemblyFileVersion。我调用了模板Assembly.tt,并使它成为一个链接文件(当您添加它时,选择add,而不是Add)。我的所有程序集都拉入链接的Assembly.tt文件。
然后,您可以从一个位置运行T4模板,它将更新所有的AssemblyVersion和AssemblyFileVersions。您不需要调用文件AssemblyInfo.cs就可以将信息拖到dlls中。
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")]发布于 2009-10-11 09:31:25
如果您有访问源的权限,请使用Graviton的建议
如果你不这么做,你可能有麻烦了。可能你可以用ILDASM拆装,也可以用ILASM重新组装。但是对于强名称的程序集来说,这是行不通的。
https://stackoverflow.com/questions/1550249
复制相似问题