none
文件版本的困惑 RRS feed

  • 问题

  • 我新建了一个工程。然后设定了版本信息。结果。。。

    1. [assembly: AssemblyVersion("1.1.*")]  结果编译后看到了 1.1.4075.29327 我靠,后面两段是怎么回事呀?我好像没有修改或发布这么多次吧。


    2.[assembly: AssemblyFileVersion("1.1.*")] 结果编译后看到 1.1.0.0 这里的*没有起作用么?

    谢谢


    信奎爷,无所畏惧!!
    2011年2月27日 8:22

答案

  • 您好,

    1、AssemblyVersion的后两位一个是内部版本号,一个修订号。当以*来表示时,内部版本号等于从2000年1月到今天的天数;修订号等于午夜0点到现在的秒数除以2。其中 “今天”以及“现在” 表示的是当您点击“生成程序集”的时间也就是编译的时间。通常用*号是.net 1.0和1.1的做法,现在已不建议,而应该根据自己的情况设定这两个值。可以把内部版本号设定为编译的次数,修订号设定为一天内修改重大bug的次数。

    2、对于AssemblyFileVersion,我看到的信息是不重要,只做参考用,故无深入研究。

    • 已建议为答案 mazhou 2011年2月28日 8:54
    • 已标记为答案 Charles Shao 2011年3月1日 4:31
    2011年2月27日 10:39
    版主
  • 关于编译次数问题,在普通的 csproj 上无法看到,但是在 TFS Build 下面就可以,比如大家知道的 Windows 版本号,6.1.7600.16384,7600 就是自增长的,从 1 开始的数字。每编译 Windows 一次,该数字就加 1。不过,Windows Team 也会直接跳过某些数字,比如 75XX 就没有,还有,Windows 7 RC (6.1.7100) 和 RTM (6.1.7600) 之间基本上的版本号都跳过了。Windows 8 开始于 7700 以及以后。

    有些版本号的定义可能会不同,比如 .NET 的版本号, 4.0.30319.1,我有在这里解释过。3 代表产品开发的年 (表示 Visual Studio 开发的第三年),0319 是编译日期,1 是修正编译/本地化版本标识。

    文件和程序集的版本号本身不代表什么含义,就像人名一样。但有些功能,如强签名,会用用到它。所以,我还是建议每一个程序集拥有合法版本号,您可以写 MSBuild 脚本让内部版本号每次编译自动增加 1。


    Mark Zhou
    2011年2月28日 9:01
  • 哈,谢谢mazhou告诉我们数字背后的故事。

    我再回答一下“编译的次数”,这个数字只有程序的作者才知道。每编译一次会手动加1。关于mazhou提到的编写msbuild的脚本,让内部版本号自动加1。我还未研究过,有空时,请mazhou给个示例。谢谢!

    2011年2月28日 9:57
    版主
  • 是啊。我也非常想了解微软的脚本化编译。 听说微软内部研发都是使用脚本华编译的,而且下一代VS也有可能提供单独的脚本化编译支持,

    因此有机会的话更想了解一下了。


    信奎爷,无所畏惧!!
    2011年3月1日 4:27
  • 响应大家的要求,我给出一个自动化控制解决方案中所有项目的编译版本的办法,并且版本可以自动增加。

    准备工作:您需要到 www.codeplex.com 上下载一个叫 MSBuild Extension Pack 的 MSBuild 扩展包,里面有几百个 MSBuild 任务的扩展。下载完后安装它。然后开始下面的工作。

    1、创建一个包含版本定义的全局 AssemblyInfo.Common.cs 文件,如下,放到一个公共目录下。

    // --------------------------------------------------------------------------------------------------------------------
    // <copyright file="AssemblyInfo.Common.cs" company="Microsoft Corp">
    //   Copyright (c) Microsoft, All Rights Reserved.
    // </copyright>
    // <summary>
    //   AssemblyInfo.Common.cs
    // </summary>
    // --------------------------------------------------------------------------------------------------------------------
     
    #region Using directives
     
    using System.Reflection;
    using System.Resources;
     
    #endregion
     
    // General Information about an assembly is controlled through the following 
    // set of attributes. Change these attribute values to modify the information
    // associated with an assembly.
    [assemblyAssemblyCompany("Microsoft Corporation")]
    [assemblyAssemblyProduct("Windows Software Development Kit")]
    [assemblyAssemblyCopyright("Copyright © 2010 Microsoft")]
     
    [assemblyAssemblyVersion("1.0.20303.19")]
    [assemblyAssemblyFileVersion("1.0.20303.0")]
     
    // Defines the default resource dictionary language for the assembly.
    [assemblyNeutralResourcesLanguage("en-US")]
    

    2、把项目中的 Properties\AssemblyInfo.cs 文件修改一下,不要包含上面的信息,比如:

    // --------------------------------------------------------------------------------------------------------------------
    // <copyright file="AssemblyInfo.cs" company="Microsoft Corp">
    //   Copyright (c) Microsoft, All Rights Reserved.
    // </copyright>
    // <summary>
    //   AssemblyInfo.cs
    // </summary>
    // --------------------------------------------------------------------------------------------------------------------
     
    #region Using directives
     
    using System;
    using System.Reflection;
    using System.Runtime.InteropServices;
     
    #endregion
     
    [assemblyAssemblyTitle("Windows Service Contract")]
     
    // Setting ComVisible to false makes the types in this assembly not visible 
    // to COM components.  If you need to access a type in this assembly from 
    // COM, set the ComVisible attribute to true on that type.
    [assemblyComVisible(false)]
     
    // Assembly exposes visible types to external, so mark this assembly as CLSCompliant.
    [assemblyCLSCompliant(true)]
     
    // The following GUID is for the ID of the typelib if this project is exposed to COM
    [assemblyGuid("3c199b11-a8eb-495c-82ca-7937514abc20")]

    3、自定义 csproj 文件,让 Visual Studio 编译时自动关联 AssemblyInfo.Common.cs 和 AssemblyInfo.cs。

    右键单击项目,选择 Unload Project,然后再次右键单击,选择 Edit Project File,您就会看到 csproj 的 XML 编辑窗口。

    在 Compile 节点的最后面,加一行 AssemblyInfo.Common.cs 的引用,如下第一行到第三行:

    <Compile Include="..\..\..\Build\AssemblyInfo.Common.cs">
          <Link>Properties\AssemblyInfo.cs</Link>
        </Compile>
        <Compile Include="Properties\AssemblyInfo.cs" />

    4、在 BeforeBuild (默认为注释掉的,请取消注释) 的那个 Target 元素里面,写如下的代码:

        <MSBuild.ExtensionPack.Framework.AssemblyInfo
          AssemblyBuildNumberType="DateString"
          AssemblyBuildNumberFormat="2MMdd"
          AssemblyFileBuildNumberType="DateString"
          AssemblyFileBuildNumberFormat="2MMdd"
          AssemblyRevisionType="AutoIncrement"
          AssemblyInfoFiles="$(AssemblyInfoFile)">
          <Output PropertyName="BuildNumber" TaskParameter="MaxAssemblyVersion"/>
        </MSBuild.ExtensionPack.Framework.AssemblyInfo>
        <Message Text="Build Number: $(BuildNumber)"></Message>

    5、在 BeforeBuild 的 Target 节点之前,加上下面的代码 (注意把目录指向 MSBuild Extension 的安装目录以及实际的 AssemblyInfo.Common.cs 的相对于该项目的路径):

    <Import Project="..\..\..\Build\Tasks\MSBuild.ExtensionPack.tasks"/>
    
    <PropertyGroup>
      <AssemblyInfoFile>..\..\Build\AssemblyInfo.Common.cs</AssemblyInfoFile>
    </PropertyGroup>

    6、保存 csproj 文件,然后右键,选择 Load Project。如果语法都正确,项目便可以正确加载,在 Properties 下面会看到 AssemblyInfo.Common.cs 以及 AssemblyInfo.cs。

    最后,Build 一把,无论是在 MSBuild,还是 Visual Studio 的 Build,版本号在每次 Build 之后都会增加 1。我这里采取的 Visual Studio 的版本模式,大家可以改改参数,选择别的模式。

    上面只是一个简单的例子供参考,希望对大家有帮助。


    Mark Zhou
    2011年3月7日 8:58
  •  感谢MaZhou的超级正确答案!! 下面为了大家访问方便,我整理了一下相关资源的下载路径。

    1。微软开源项目网站: http://www.CodePlex.com/

    2。MSBuild Extension 项目的入口  http://msbuildextensionpack.codeplex.com/

    3。MSBuild Extension Pack December 2010 (All Files)  网站推荐下在这个,貌似全有了。15MB

    4。MSBuild Extension Pack 4.0.2.0 Installer

    5。MSBuild Extension Pack Help 4.0.2.0

    6。MSBuild Extension Pack Binaries 4.0.2.0


    信奎爷,无所畏惧!!
    2011年3月7日 9:51

全部回复

  • 您好,

    1、AssemblyVersion的后两位一个是内部版本号,一个修订号。当以*来表示时,内部版本号等于从2000年1月到今天的天数;修订号等于午夜0点到现在的秒数除以2。其中 “今天”以及“现在” 表示的是当您点击“生成程序集”的时间也就是编译的时间。通常用*号是.net 1.0和1.1的做法,现在已不建议,而应该根据自己的情况设定这两个值。可以把内部版本号设定为编译的次数,修订号设定为一天内修改重大bug的次数。

    2、对于AssemblyFileVersion,我看到的信息是不重要,只做参考用,故无深入研究。

    • 已建议为答案 mazhou 2011年2月28日 8:54
    • 已标记为答案 Charles Shao 2011年3月1日 4:31
    2011年2月27日 10:39
    版主
  • 1、AssemblyVersion的后两位一个是内部版本号,一个修订号。当以*来表示时,内部版本号等于从2000年1月到今天的天数;修订号等于午夜0点到现在的秒数除以2。其中 “今天”以及“现在” 表示的是当您点击“生成程序集”的时间也就是编译的时间。通常用*号是.net 1.0和1.1的做法,现在已不建议,而应该根据自己的情况设定这两个值。可以把内部版本号设定为编译的次数,修订号设定为一天内修改重大bug的次数。

      请问您所说的“编译的次数”这个数据在什么地方可以查到呀?
    信奎爷,无所畏惧!!
    2011年2月27日 14:19
  • 关于编译次数问题,在普通的 csproj 上无法看到,但是在 TFS Build 下面就可以,比如大家知道的 Windows 版本号,6.1.7600.16384,7600 就是自增长的,从 1 开始的数字。每编译 Windows 一次,该数字就加 1。不过,Windows Team 也会直接跳过某些数字,比如 75XX 就没有,还有,Windows 7 RC (6.1.7100) 和 RTM (6.1.7600) 之间基本上的版本号都跳过了。Windows 8 开始于 7700 以及以后。

    有些版本号的定义可能会不同,比如 .NET 的版本号, 4.0.30319.1,我有在这里解释过。3 代表产品开发的年 (表示 Visual Studio 开发的第三年),0319 是编译日期,1 是修正编译/本地化版本标识。

    文件和程序集的版本号本身不代表什么含义,就像人名一样。但有些功能,如强签名,会用用到它。所以,我还是建议每一个程序集拥有合法版本号,您可以写 MSBuild 脚本让内部版本号每次编译自动增加 1。


    Mark Zhou
    2011年2月28日 9:01
  • 哈,谢谢mazhou告诉我们数字背后的故事。

    我再回答一下“编译的次数”,这个数字只有程序的作者才知道。每编译一次会手动加1。关于mazhou提到的编写msbuild的脚本,让内部版本号自动加1。我还未研究过,有空时,请mazhou给个示例。谢谢!

    2011年2月28日 9:57
    版主
  • 是啊。我也非常想了解微软的脚本化编译。 听说微软内部研发都是使用脚本华编译的,而且下一代VS也有可能提供单独的脚本化编译支持,

    因此有机会的话更想了解一下了。


    信奎爷,无所畏惧!!
    2011年3月1日 4:27
  • 响应大家的要求,我给出一个自动化控制解决方案中所有项目的编译版本的办法,并且版本可以自动增加。

    准备工作:您需要到 www.codeplex.com 上下载一个叫 MSBuild Extension Pack 的 MSBuild 扩展包,里面有几百个 MSBuild 任务的扩展。下载完后安装它。然后开始下面的工作。

    1、创建一个包含版本定义的全局 AssemblyInfo.Common.cs 文件,如下,放到一个公共目录下。

    // --------------------------------------------------------------------------------------------------------------------
    // <copyright file="AssemblyInfo.Common.cs" company="Microsoft Corp">
    //   Copyright (c) Microsoft, All Rights Reserved.
    // </copyright>
    // <summary>
    //   AssemblyInfo.Common.cs
    // </summary>
    // --------------------------------------------------------------------------------------------------------------------
     
    #region Using directives
     
    using System.Reflection;
    using System.Resources;
     
    #endregion
     
    // General Information about an assembly is controlled through the following 
    // set of attributes. Change these attribute values to modify the information
    // associated with an assembly.
    [assemblyAssemblyCompany("Microsoft Corporation")]
    [assemblyAssemblyProduct("Windows Software Development Kit")]
    [assemblyAssemblyCopyright("Copyright © 2010 Microsoft")]
     
    [assemblyAssemblyVersion("1.0.20303.19")]
    [assemblyAssemblyFileVersion("1.0.20303.0")]
     
    // Defines the default resource dictionary language for the assembly.
    [assemblyNeutralResourcesLanguage("en-US")]
    

    2、把项目中的 Properties\AssemblyInfo.cs 文件修改一下,不要包含上面的信息,比如:

    // --------------------------------------------------------------------------------------------------------------------
    // <copyright file="AssemblyInfo.cs" company="Microsoft Corp">
    //   Copyright (c) Microsoft, All Rights Reserved.
    // </copyright>
    // <summary>
    //   AssemblyInfo.cs
    // </summary>
    // --------------------------------------------------------------------------------------------------------------------
     
    #region Using directives
     
    using System;
    using System.Reflection;
    using System.Runtime.InteropServices;
     
    #endregion
     
    [assemblyAssemblyTitle("Windows Service Contract")]
     
    // Setting ComVisible to false makes the types in this assembly not visible 
    // to COM components.  If you need to access a type in this assembly from 
    // COM, set the ComVisible attribute to true on that type.
    [assemblyComVisible(false)]
     
    // Assembly exposes visible types to external, so mark this assembly as CLSCompliant.
    [assemblyCLSCompliant(true)]
     
    // The following GUID is for the ID of the typelib if this project is exposed to COM
    [assemblyGuid("3c199b11-a8eb-495c-82ca-7937514abc20")]

    3、自定义 csproj 文件,让 Visual Studio 编译时自动关联 AssemblyInfo.Common.cs 和 AssemblyInfo.cs。

    右键单击项目,选择 Unload Project,然后再次右键单击,选择 Edit Project File,您就会看到 csproj 的 XML 编辑窗口。

    在 Compile 节点的最后面,加一行 AssemblyInfo.Common.cs 的引用,如下第一行到第三行:

    <Compile Include="..\..\..\Build\AssemblyInfo.Common.cs">
          <Link>Properties\AssemblyInfo.cs</Link>
        </Compile>
        <Compile Include="Properties\AssemblyInfo.cs" />

    4、在 BeforeBuild (默认为注释掉的,请取消注释) 的那个 Target 元素里面,写如下的代码:

        <MSBuild.ExtensionPack.Framework.AssemblyInfo
          AssemblyBuildNumberType="DateString"
          AssemblyBuildNumberFormat="2MMdd"
          AssemblyFileBuildNumberType="DateString"
          AssemblyFileBuildNumberFormat="2MMdd"
          AssemblyRevisionType="AutoIncrement"
          AssemblyInfoFiles="$(AssemblyInfoFile)">
          <Output PropertyName="BuildNumber" TaskParameter="MaxAssemblyVersion"/>
        </MSBuild.ExtensionPack.Framework.AssemblyInfo>
        <Message Text="Build Number: $(BuildNumber)"></Message>

    5、在 BeforeBuild 的 Target 节点之前,加上下面的代码 (注意把目录指向 MSBuild Extension 的安装目录以及实际的 AssemblyInfo.Common.cs 的相对于该项目的路径):

    <Import Project="..\..\..\Build\Tasks\MSBuild.ExtensionPack.tasks"/>
    
    <PropertyGroup>
      <AssemblyInfoFile>..\..\Build\AssemblyInfo.Common.cs</AssemblyInfoFile>
    </PropertyGroup>

    6、保存 csproj 文件,然后右键,选择 Load Project。如果语法都正确,项目便可以正确加载,在 Properties 下面会看到 AssemblyInfo.Common.cs 以及 AssemblyInfo.cs。

    最后,Build 一把,无论是在 MSBuild,还是 Visual Studio 的 Build,版本号在每次 Build 之后都会增加 1。我这里采取的 Visual Studio 的版本模式,大家可以改改参数,选择别的模式。

    上面只是一个简单的例子供参考,希望对大家有帮助。


    Mark Zhou
    2011年3月7日 8:58
  •  感谢MaZhou的超级正确答案!! 下面为了大家访问方便,我整理了一下相关资源的下载路径。

    1。微软开源项目网站: http://www.CodePlex.com/

    2。MSBuild Extension 项目的入口  http://msbuildextensionpack.codeplex.com/

    3。MSBuild Extension Pack December 2010 (All Files)  网站推荐下在这个,貌似全有了。15MB

    4。MSBuild Extension Pack 4.0.2.0 Installer

    5。MSBuild Extension Pack Help 4.0.2.0

    6。MSBuild Extension Pack Binaries 4.0.2.0


    信奎爷,无所畏惧!!
    2011年3月7日 9:51