2

(如果我在这里混淆了任何术语,请原谅 - 我是一名 Java 开发人员,不熟悉 .Net 和 C#。如果需要,请在此问题上添加/更正任何标签。)

我正在使用 MSBuild 脚本来构建我的项目。其中一项任务是编写程序集信息:

<Target Name="UpdateAssemblyInfo">
    <Message Text="Updating assemblies to file version $(AssemblyVersion) ($(AssemblyFileVersion))" Importance="high"/>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="SharedAssemblyInfo.cs" 
                  AssemblyVersion="$(AssemblyVersion)"
                  AssemblyFileVersion="$(AssemblyFileVersion)"
                  AssemblyProduct="SVN revision $(BUILD_NUMBER)"/>
</Target>

SharedAssemblyInfo.cs从这里转换:

[assembly: System.Reflection.AssemblyVersion("0.0.0")]

对此:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18063
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: System.Reflection.AssemblyVersion("1.4.0")]
[assembly: System.Reflection.AssemblyFileVersion("1.4.0.85725")]
[assembly: System.Reflection.AssemblyProduct("SVN revision 85725")]

到目前为止,一切都很好。除了我在 TeamCity 的构建日志中看到以下消息:

CSC 警告 CS1607:程序集生成 -- 为“文件版本”指定的版本“1.4.0.85725”不是正常的“major.minor.build.revision”格式

当版本的格式似乎遵循警告消息中指定的格式时,为什么我会收到此警告?

4

2 回答 2

6

您收到错误的原因是修订号大于 65534。

于 2014-03-06T10:03:22.110 回答
4

当版本的格式似乎遵循警告消息中指定的格式时,为什么我会收到此警告?

重新阅读该警告,并添加一些重点:

正常的“major.minor.build”。修订格式

.NET 版本号有四个部分,而不是三个部分。

System.Version用于此的类型将处理较少类型的版本,但代码System.Version用于检查和更严格是可能的。

另外,正如Mihai所指出的,版本的元素仅限于System.UInt16.MaxValue(65535):这是一个 Windows API 限制(在 System.Version 中,每个元素都是 a System.Int32)与编译器从各种程序集插入程序集的本机1资源相关属性。这允许 Windows 资源管理器等工具读取版本。VS_FIXEDFILEINFO

概括:

  • 版本应该有四个部分。
  • 每个部分应在 [0, 65535] 范围内。

1版本存储在两个DWORD成员中:一个用于主要和次要部分,另一个用于构建和修订(尽管在 Win32 中没有给出这些名称)。

于 2014-03-06T10:10:59.157 回答