2011-08-02 47 views
1

所以我在調試模式下構建時爲我的程序集名稱添加了一個「d」擴展名。至於我可以告訴標準的方式在C#這樣做是編輯的.csproj文件,並把在以下幾點:有條件的AssemblyName會導致C#項目在使用「Debug」/「Release」以外的名稱時始終會重建

<PropertyGroup> 
    <AssemblyName Condition="'$(Configuration)' == 'V90 Debug'">$(AssemblyName)d</AssemblyName> 
</PropertyGroup> 

具有所需的效果,但現在的織補工程總重建輸出。 DLL,導致依賴它的其他項目重新鏈接等。沒有這個變化,我沒有任何這樣的問題。

迄今爲止,增加項目輸出的詳細程度並沒有幫助。

編輯:另外一個重要的細節是我們使用「V90發佈」,「V90調試」,「V100發佈」等名稱來配置,以便我們可以將不同版本的Visual Studio運行時。我用標準配置名稱編寫了一個測試應用程序,發現我的問題在這種情況下不會發生。

+2

你爲什麼這麼做非標準? (沒有「標準」方式來做你正在做的事情)。 – Oded

+0

那麼,標準的意義上,這是在StackOverflow這裏接受的答案:http://stackoverflow.com/questions/2855629/c-vs-net-change-name-of-exe-depending-on-conditional-compilation-符號。我這樣做是因爲它允許調試和釋放DLL共存在同一個目錄中,而不用命名衝突。 –

+1

@Nathan爲什麼你要他們存在於同一個目錄?它具有非常標準的Debug \ Release \無論目錄。 –

回答

3

您在C/C++開發中使用的是舊標準。與託管代碼的巨大差異在於缺少鏈接器。您曾經配置鏈接器以在Debug版本中使用庫的「d」版本,這是版本構建中庫的非d版本。這種機制在.NET中完全沒有,庫中的代碼在運行時動態鏈接。實際上爲不同構建命名的名稱要少得多。

如果你追求這個舊策略,你會遇到的問題之一是你會在項目的引用程序集中遇到其他問題。沒有像樣的方式在不同的配置中使用不同的名稱。從屬程序集列在項目的引用節點中,這是不依賴於配置的項目的屬性。這不是不可能的,你需要更多的Condition黑客來重命名參考程序集。構建依賴檢查也很可能受到這種影響。

這實際上並不是必須的,程序集的調試和發佈版本將具有相同的元數據。但是如果你跳過這個,你現在在運行時會遇到問題。 CLR將被告知使用錯誤的程序集名稱。通過將程序集隱藏在子目錄中並使用AppDomain.AssemblyResolve事件加載正確的程序,技術上可以實現這一點。您需要一個生成後事件來重命名並將程序集複製到此目錄中。當這些程序集依賴於其他程序集時,這一切都會很匆忙。

長話短說,您以前的標準對於託管代碼來說並不是一個好的選擇。

相關問題