【问题标题】:Programmatically change the AssemblyVersion and AssemblyFileVersion attributes以编程方式更改 AssemblyVersion 和 AssemblyFileVersion 属性
【发布时间】:2010-12-05 17:37:58
【问题描述】:

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

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

现在的问题是:第二步怎么做?

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

对此有何提示?

【问题讨论】:

    标签: c# .net attributes versioninfo


    【解决方案1】:

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

    其实我不知道是否可以直接修改DLL文件,而不用花哨的东西。

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

    【讨论】:

    • 是的,那会容易得多!在构建时直接设置版本号,例如使用持续集成构建服务器
    • 这将是正确的方法,更改已编译的文件会破坏代码和二进制文件之间的干净信息行。
    • 非常感谢,我很喜欢分享 AssemblyInfo.cs 文件的想法!
    • 共享相同的 AssemblyInfo.cs 不是一个好主意 - 如果您的 DLL 具有 ComVisible,那么您无法区分 GUID 和其他关于程序集的信息
    【解决方案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")]
    

    【讨论】:

      【解决方案3】:

      如果您可以访问资源,请拨打advice from Graviton

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

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 2021-04-25
        • 2021-09-03
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        相关资源
        最近更新 更多