2014-02-21 90 views
2

我有一個應用程序與我從Visual Studio 2008升級到Visual Studio 2010的各種引用。在該應用程序中,各種引用在某些情況下將複製本地設置爲false,以防止VS生成數百個「對象已定義」錯誤消息。爲什麼Visual Studio 2012不記得我的'Copy Local'首選項?

這一切都在Visual Studio 2008中正常工作,但升級到2012年後,似乎我們不能再改變這些屬性。例如,我有一個要禁用「複製本地」的程序集,但是當我將其更改爲False並單擊應用時,設置將還原爲True。

我錯過了什麼? VS 2012中是否有新的設置取代了該選項或其他問題?

編輯 - 無論是否使用「複製本地」的,有顯得有些奇怪的行爲。要複製該問題,請啓動一個新的控制檯項目,添加一個類庫並從控制檯項目中引用它。控制檯項目設置顯示此:

enter image description here

...但該項目的檔案上寫着什麼,即:

enter image description here

沒事的時候設置的行爲,但是,它確實副本本地:

enter image description here

在切換CopyLocal後從falsetrue項目和保存項目文件時,它現在包含:

enter image description here

...但是GUI總是說假的!

enter image description here

回答

2

各種文獻有複製本地設置爲false

這不可能是正確的,你說的是錯誤的設置。複製本地在編譯過程中不起作用。它只是確保將程序集複製到構建目錄,以便您可以調試程序。對於存儲在GAC或項目引用中的程序集,它只應該是False。你需要它設置爲True對於任何其他程序集或者你不能運行你的程序。

你一定是在談論另一個設置,在VS2008中「在構建中使用」和「在構建中使用依賴關係」與您的問題有關。這在VS2012中是不同的,VS2012是VS2010中構建的一部分。

當您違反C++中的One Definition Rule時,您會收到「已定義」的編譯錯誤。這在C++/CLI中很容易實現,因爲它使您可以導入定義的兩種方式。首選的方法是通過彙編引用,編譯器從元數據中導入所有公共ref類。當您通過.h文件以傳統方式導入它時,ODR被違反了。你強烈的應該更喜歡程序集引用,類的聲明不能與定義不同步。而且你不會在最終的程序中得到重複的代碼。此外,InvalidCastExceptions的一個非常難以排除故障的令人討厭的來源是,一個程序集中的類與另一個程序集中的類不相同,即使它們具有相同的名稱空間和類名稱。 .NET中強大的DLL地獄對策。

VS2008設置不再可用,您現在只有「引用程序集輸出」。通常設置爲True,因此編譯器會導入元數據中的定義,這是首選方式。

+1

感謝Hans。儘管你是正確的,但這並不能解釋爲什麼GUI不記得這個設置。看起來,我們在「複製本地」選項中觀察到的錯誤(正如您所說的,確實是錯誤的改變)並不是問題的根源。從我們所看到的情況看,在項目文件中,'CopyLocal'已被'Private'XML標籤取代。更改「CopyLocal」設置會更改XML文件,但不會影響Visual Studio GUI中的項目設置。 –

相關問題