[英]CS1607: Assembly generation — The version '1.4.0.85725' specified for the 'file version' is not in the normal 'major.minor.build.revision' format
[英]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
。 AssemblyInformationalVersion
是xyz
,則兩個ProductVersion
值都是xyz
。 AssemblyInformationalVersion
是另一個字符串,數量值ProductVersion
未設置( 0.0.0
),只有文本ProductVersion
值設置。 我不明白的是, 為什么 CS1607警告僅在某些特定情況下由編譯器生成:在我的情況下,僅當項目包含本地化的resx文件和目標.Net 2.0時 。
我在AssemblyInformationalVersion
使用了一個字符串多年沒有任何警告,直到昨天我向項目添加了本地化的resx。
我沒有設置ProductVersion
數值(正如你所說,只有文本和人類可讀的值對我來說很重要),但有沒有辦法防止警告被提出?
編輯2:
我創建了一個非常小的解決方案示例來演示此問題: http : //sharesend.com/mb371c3l
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.