2010-06-04 45 views
2

我有一個.NET 4.0項目(C#)的解決方案,它生成一個延遲簽名的dll,我對它進行了模糊處理和簽名。引用dll時忽略內部版本號

編輯:這是我如何版本的DLL:

[assembly: AssemblyVersion("0.7.0.*")] 
[assembly: AssemblyFileVersion("0.7.0.0")] 

我有一個.NET 4.0項目另一種解決方案(C++/CLI)引用簽署的dll,併產生一個簽名的DLL(實際上,由於a flaw in the C++ build system,延遲簽署和簽署後發佈)。

問題是,對dll的引用包含特定的版本號,甚至包括內部版本號(我想要一個內部版本號)。

每次我構建引用的dll時,我必須更改項目設置文件(.vcxproj),以便它引用新版本的dll。由於我使用源代碼管理,這是非常不方便的(不同的計算機可能會有不同的內部版本號,因爲每臺計算機都構建自己的引用dll - 引用的dll不在源代碼管理中)。

如果我不改變的參考,我得到一個警告:

警告MSB3245:無法解析 此引用。無法找到 裝配...

而且很多象這樣的錯誤:

錯誤C3083:「富」:符號到 左側的「::」必須是一個類型

一旦我改變了引用,這些就解決了。

如何讓引用忽略內部版本號甚至整個版本號?

回答

5

C#IDE有一個選項「Specific Version = False」。在C++/CLI IDE中不可用。坦率地說,這不是一個真正的問題。您可能錯誤地使用了[AssemblyVersion]屬性。該版本與程序集中公開可見的類相關聯。如果您對這些類的公共成員進行了任何更改,那麼您就有可能發生重大更改,從而導致依賴這些類的代碼失敗。

那一點你應該改變[AssemblyVersion]。任何使用程序集的項目都必須更新其引用程序集並且必須重新編譯。

另外一個非破壞性更改,例如錯誤修復或不可見類中的調整,會生成一個新文件,該文件與任何使用它的項目完全兼容。你應該更新[AssemblyFileVersion]號碼。在C++/CLI項目中需要更新非託管版本資源。更改相應的.rc文件可以是自動的,也可以使用#define。

注意版本2.0中的.NET基本程序集的行爲方式相同。他們的[AssemblyVersion]在3.0,3.5和3.5 SP1版本中保持2.0.0.0。他們的文件版本從2.0.50727.42開始。在過去的5年中增加了很多倍,達到2.0.50727.4927,

爲了記錄,您鏈接到的VS2010錯誤不是一個錯誤。它從來沒有工作過,失敗是沉默的。這是C++構建系統中的一個缺陷,mt.exe在之後嵌入了清單,該程序集是強命名的。在這個過程中打破了強名,因爲它改變了文件散列。 VS2010實際上是一個改進,它警告它而不是默默地讓一個破碎的強名通過。您不必延遲簽名,只需在發佈後事件中使用-Ra即可辭職。

+0

+1。謝謝。我已經編輯了我的問題,包括我編譯程序集的方式,並提及它在構建中的缺陷,而不是VS2010中的錯誤。我希望每個版本都能創建一個新版本,這隻能使用[AssemblyVersion]而不是[AssemblyFileVersion]來完成。我不應該在[AssemblyVersion]中使用「*」嗎? – brickner 2010-06-04 17:47:43

+0

是的,在[AssemblyVersion]中使用*會導致問題。 – 2010-06-04 17:52:25

+0

謝謝@Hans Passant。順便說一下,的確,我不必拖延簽名。但是如果我不這樣做,我會收到警告。警告810100b3:...是強名稱簽署的程序集,嵌入清單會使簽名無效。您需要重新簽署此文件以使其成爲有效的程序集。 – brickner 2010-06-04 17:54:21