gpt4 book ai didi

c# - 为什么会生成警告 CS1607 "The version specified for the ' product version' is not in the normal 'major.minor.build.revision' format?

转载 作者:太空狗 更新时间:2023-10-29 20:24:11 25 4
gpt4 key购买 nike

今天我收到一个为“产品版本”指定的版本不是正常的“major.minor.build.revision”格式警告。

AssemblyInformationalVersionAttribute的使用有关.

我的程序集属性是:

[assembly: AssemblyInformationalVersion("XXX 1.1.0")]
[assembly: System.Runtime.InteropServices.ComVisible(false)]

基本上,编译器会提示 XXX 1.1.0 看起来不像 x.y.z.r。来自 MSDN:

The informational version provides additional version information for an assembly, in string format. It is for informational purposes only and is not used at run time. Although you can specify any text, a warning message appears on compilation if the string is not in the format used by the assembly version number, or if it is in that format but contains wildcard characters. This warning is harmless.

所以他们说可能会出现无害的警告。问题是,它破坏了我的构建。我什至无法按照以下错误中的建议抑制 CS1607 警告(我在项目级别尝试过,没有效果)http://connect.microsoft.com/VisualStudio/feedback/details/275197/assemblyinformationalversion-should-not-generate-cs1607

实际上,在我将本地化资源添加到我的项目之前,一切都很好(没有警告)。我以前在项目中有一个 MyResources.resx 文件。我添加了一个本地化的 MyResources.fr.resx 文件,这个资源是警告的来源(或者至少:如果我从项目中删除这个文件,它会在没有警告的情况下编译)。

我没有看到 CS1607(与 x64 和 x86 相关)、AssemblyInformationalVersionAttribute 和本地化资源文件之间的任何链接...

如何修复我的项目,以便我可以将 XXX 1.1.0 用作 AssemblyInformationalVersionAttribute 而没有任何(甚至无害的)警告?

我不太擅长抑制 CS1607 警告(这在引用错误的情况下可能很有用),但我什至没有设法抑制它。

请注意,我通过谷歌搜索发现它是 CS1607,编译器从未返回实际的警告代码。

另请注意,我的项目目标是 .Net 2.0,迁移到 .Net 4.0 可以解决这个问题(但我当然不能这样做)。

欢迎任何解释。

附言: CS1607: The version specified for the 'file version' is not in the normal 'major.minor.build.revision' format in .NET问题不相关(与AssemblyInformationalVersion无关)


编辑:谢谢汉斯·帕桑特。根据您的回答,我了解到 AssemblyInformationalVersion 用于生成 Win32 VersionInfo 结构中可用的两个 ProductVersion 值。

  • 如果 AssemblyInformationalVersion 属性为空,则使用 AssemblyVersion
  • 如果 AssemblyInformationalVersionx.y.z,则两个 ProductVersion 值都是 x.y.z
  • 如果 AssemblyInformationalVersion 是另一个字符串,则 ProductVersion 的数字值未设置 (0.0.0),只有文本 ProductVersion 值已设置。

我不明白的是,为什么 CS1607 警告仅由编译器在某些特定情况下生成:在我的例子中,仅当项目包含本地化的 resx 文件和目标 .Net 时2.0

我在 AssemblyInformationalVersion 中使用了一个字符串多年,直到昨天我在项目中添加了一个本地化的 resx 时才发出任何警告。

我可以不设置数字 ProductVersion 值(如您所说,只有文本和人类可读的值对我来说很重要),但是有没有办法防止警告从被抚养?


编辑 2:

我创建了一个非常小的解决方案示例来演示该问题:http://sharesend.com/mb371c3l

  • 第一次编译:预期由编译器引发 CS1607。
  • 然后删除 Logon.aspx.fr.resx 并重建所有:我的机器上不再有警告,原因不明。

最佳答案

C# 编译器确实对这些属性进行了简单的转换。它需要为可执行文件生成非托管 资源。必要的,因为 Windows 对托管资源或属性一无所知。这通常是自动完成的。就像 [AssemblyInformationalAttribute] 自动转换为生成 Version 资源的产品版本号一样。请注意严重的命名不匹配,不是错误。

然而,非托管产品版本非常麻烦。您在 FileVersionInfo 类中看到的东西,允许您从可执行文件中读回非托管版本资源的东西。请注意其 ProductVersion 属性如何返回一个字符串。但是 ProductMajorPart(以及 minor、build 和 private)属性返回一个 int

您现在可能已经看到摩擦了。由于一些长期遗忘在时间迷雾中的深不可测的原因,版本资源的原始规范包含了产品版本两次。一次作为二进制数,再次作为字符串。字符串可以本地化,这是造成这种重复的可能原因。当您使用非托管资源编辑器查看资源时,您也可以看到这一点。使用文件 + 打开 + 文件并选择可执行文件。双击 Version.1 资源。您还会看到产品版本在此对话框中出现两次。顶部的只接受数字,底部的接受任何字符串。

这让 C# 编译器无所事事,它必须将属性字符串转换为整数,这样它也可以生成二进制数。显然,它不能在没有至少产生警告的情况下就让它出错。 CS1607 的 MSDN 文档中关于这是良性的断言并不十分准确,您确实最终得到了没有二进制产品版本集的资源。然而,这最终导致麻烦的可能性并不大,其他程序通常不会读回它,而且它往往只被人类查看。该文件的资源管理器属性对话框中的“详细信息”属性表会显示它。字符串,不是二进制数。

因此,您需要考虑的变通办法是仅指定一个有效的版本号,因为它确实 是一个版本号。或者自己接管非托管资源的生成,这样您就可以完全控制内容。您可以通过编写资源脚本并使用 rc.exe 进行编译来实现。并通过“项目 + 属性”、“应用程序”选项卡将其告知 C# 编译器,选择“资源文件”单选按钮。请注意您会给自己带来的相当大的痛苦,您现在还有一个任务是保持资源脚本更新并与托管资源同步。我会说,卫星组件特别痛苦。

关于c# - 为什么会生成警告 CS1607 "The version specified for the ' product version' is not in the normal 'major.minor.build.revision' format?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20241686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com