2013-11-27 40 views
7

今天我得到一個爲'產品版本'指定的版本不是正常的'major.minor.build.revision'格式警告。爲什麼警告CS1607「爲'產品版本'指定的版本不是以正常的'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:

信息版本以字符串格式爲程序集提供了 的其他版本信息。它僅供參考,僅供參考 ,並未在運行時使用。儘管您可以指定任何文本,但如果字符串不是彙編版本號使用的 格式,或者格式爲 但包含通配符,則編譯時會出現 警告消息。這個警告是無害的。

所以他們說一個警告是無害可以發生。問題是,它打破了我的構建。我甚至無法抑制CS1607的警告(我試圖在項目級別,沒有影響),如下面的錯誤建議:http://connect.microsoft.com/VisualStudio/feedback/details/275197/assemblyinformationalversion-should-not-generate-cs1607

事實上,一切都很好(沒有警告),直到我將本地化資源添加到我的項目。我之前在項目中有一個MyResources.resx文件。我添加了一個本地化的MyResources.fr.resx文件,並且此資源是警告的來源(或者至少:如果我從項目中刪除此文件,它會在沒有警告的情況下編譯)。

我沒有看到任何CS1607之間AssemblyInformationalVersionAttribute和本地化的資源文件鏈接(與64 VS 86),...

我怎麼能解決我的項目,所以我可以使用XXX 1.1.0AssemblyInformationalVersionAttribute沒有任何(甚至無害)警告?

我對抑制CS1607警告並沒有那麼好(這可能對錯誤引用有用),但我甚至沒有設法抑制它。

請注意我發現它是CS1607通過谷歌搜索,編譯器從來沒有返回實際的警告代碼。

另請注意我的項目目標.Net 2.0,並轉移到.net 4.0修復問題(但我當然不能這樣做)。

歡迎任何解釋。

PS: 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並重建所有:在我的機器上不再發出警告,原因不明。

回答

6

C#編譯器確實對這些屬性進行了平凡的轉換。它需要爲可執行文件生成非託管資源。必要的,因爲Windows不知道任何關於託管資源或屬性。這通常是自動完成的。就像[AssemblyInformationalAttribute]被自動轉換爲生成版本資源的產品版本號。請注意嚴重的命名不匹配,而不是錯誤。

非託管產品版本是相當麻煩的。您在FileVersionInfo類中看到的某個內容,它允許您從可執行文件中讀回非託管版本資源。請注意其ProductVersion屬性如何返回字符串。但是ProductMajorPart(以及次要,構建和私有)屬性返回int

你現在可能會看到摩擦。對於長時間在迷霧中迷失的某些深不可測的原因,版本資源的原始規格包括產品版本兩次。一次作爲二進制數字,再次作爲一個字符串。字符串可以被本地化,這是重複的可能原因。當您使用非託管資源編輯器查看資源時,您也可以看到它。使用File + Open + File並選擇可執行文件。雙擊Version.1資源。您將看到產品版本在該對話框中出現兩次。最上面的一個只接受數字,最下面的一個接受任何字符串。

這使得C#編譯器無需使用槳即可啓動溪,它必須必須將屬性字符串轉換爲整數,以便它也可以生成二進制數。顯然,如果沒有至少發出警告,它不能讓它出錯。在MSDN文檔CS1607聲明這是良性的不是非常準確,你真的最終會得到一個沒有二進制產品版本設置的資源。然而,這最終導致麻煩的可能性並不大,其他程序通常不會讀回來,它往往只能被人類看到。文件的資源管理器「屬性」對話框中的「詳細信息」屬性表顯示該文件。字符串,而不是二進制數。

因此,您需要考慮的解決方法是隻指定有效的版本號,因爲它確實是的版本號。或者自己接管非託管資源的生成,以便完全控制內容。你可以通過編寫資源腳本並使用rc.exe進行編譯。並通過Project + Properties,Application選項卡告訴C#編譯器,選擇「Resource file」單選按鈕。要小心自己會對自己造成的巨大痛苦,現在您也有責任保持資源腳本更新並與受管資源保持同步。對於衛星組件會特別痛苦,我會說。

+0

非常感謝您的詳細解答。我編輯了原始問題,添加了一些關於我對這個問題的理解的背景。請看看編輯。 – ken2k

+0

我不明白,現在應該清楚爲什麼你應該*得到警告。不清楚的是爲什麼你*以前沒有得到警告。或者,也許你做了,而且你做了一些令人不可思議的事情,導致構建失敗的警告。這並不重要,請盡你所能去做,以免造成構建失敗。使用真正的版本號而不是「XXX 1.1.0」作爲明顯的解決方案。 –

+0

@HansPassant是的,我很清楚爲什麼我會得到警告。我不清楚的是,爲什麼警告突然出現在今天,而不是在過去兩年內出現相同的代碼(請參閱我的問題了解我今天所做的更改)。不幸的是,由於某些原因,我無法修復「XXX 1.1.0」爲「1.1.0」(我無法改變文本ProductVersion的顯示方式,因爲我已經使用此模式發佈了很多我的版本) 。想要實現的目的是爲了隱藏這個非常具體的組件的警告,所以我的構建不會失敗(我配置了TFS,因此在發出警告的情況下拒絕構建)。 – ken2k

相關問題