簡體   English   中英

為什么警告CS1607“為'產品版本'指定的版本不是正常的'major.minor.build.revision'格式”生成的?

[英]Why is warning CS1607 “The version specified for the 'product version' is not in the normal 'major.minor.build.revision' format” generated?

今天我得到了一個為'產品版本'指定的版本不符合正常的'major.minor.build.revision'格式警告。

它與AssemblyInformationalVersionAttribute的使用有關。

我的程序集屬性是:

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

基本上編譯器抱怨XXX 1.1.0看起來不像xyzr 來自MSDN:

信息版本以字符串格式提供程序集的附加版本信息。 它僅供參考,不在運行時使用。 雖然您可以指定任何文本,但如果字符串不是程序集版本號使用的格式,或者如果它采用該格式但包含通配符,則會在編譯時顯示警告消息。 這個警告是無害的。

所以他們說可能會發生無害的警告。 問題是,它破壞了我的構建。 我甚至無法抑制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修復了這個問題(當然我不能這樣做)。

歡迎任何解釋。

PS: CS1607:為'文件版本'指定的版本不是正常的'major.minor.build.revision'格式在.NET中問題是無關的(不是關於AssemblyInformationalVersion


編輯:謝謝Hans Passant。 根據您的回答,我了解AssemblyInformationalVersion用於生成Win32 VersionInfo結構中可用的兩個ProductVersion值。

  • 如果AssemblyInformationalVersion屬性為空,則使用AssemblyVersion
  • 如果AssemblyInformationalVersionxyz ,則兩個ProductVersion值都是xyz
  • 如果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

你現在可能已經看到了摩擦。 由於在時間的迷霧中長期丟失的一些不可思議的原因,版本資源的原始規格包括產品版本兩次 一旦作為二進制數字,再次作為字符串。 字符串可以本地化,這是重復的可能原因。 使用非托管資源編輯器查看資源時,您也可以看到此信息。 使用File + Open + File並選擇可執行文件。 雙擊Version.1資源。 您將在此對話框中看到產品版本兩次出現。 頂部只接受數字,底部接受任何字符串。

這使C#編譯器在沒有paddle的情況下離開了小溪,它必須將屬性字符串轉換為整數,這樣它也可以生成二進制數。 顯然,如果不至少產生警告,它就不能讓它出錯。 在MSDN doc for CS1607中聲明這是良性的並不是非常准確,你真的最終得到的資源沒有設置二進制產品版本。 然而,這最終導致麻煩的可能性並不是那么大,其他程序通常不會讀回來,而且往往只會被人類看待。 Explorer的“屬性”對話框中的“詳細信息”屬性表顯示該文件。 字符串,而不是二進制數。

因此,您需要考慮的變通方法是僅指定有效的版本號,因為它確實版本號。 或者自己接管非托管資源的生成,以便您可以完全控制內容。 您可以通過編寫資源腳本並使用rc.exe進行編譯來完成此操作。 並通過Project + Properties,Application選項卡告訴C#編譯器,選擇“Resource file”單選按鈕。 請注意您將對自己造成的相當大的痛苦,您現在還要完成保持資源腳本更新並與托管資源同步的任務。 我會說,對於衛星組件特別痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM