0

我有一個基礎庫來維護多個版本。我需要在另一個版本上工作時,我會執行SVN切換。VS2008:具有定義的多個構建配置不能按預期工作

我沒有多個版本的測試應用程序解決方案,因此我認爲對於不同的版本,我可以執行多個解決方案/項目配置,以定義該版本的符號,以便能夠在我的測試中使用特定於版本的代碼。

目前,我在測試應用程序解決方案中具有以下構建配置:調試,發佈,DebugV10,ReleaseV10,DebugV15,ReleaseV15。在* V10和* V15配置中,我爲兩個具有特定版本測試代碼的項目創建並選擇了相應的* V10和* V15 PROJECT配置(並非針對所有項目,大多數在解決方案中運行正常的調試/發佈配置-Vx組態)。

在那些項目配置中,我輸入了相應的條件編譯符號(VERSION10和VERSION15)。

現在在我的項目中的代碼,我去喜歡

#if VERSION10 
    // do v1.0 stuff 
#elif VERSION15 
    // do v1.5 stuff 
#else 
    // do trunk stuff 
#endif 

但顯然VS不能識別的符號。即使是一個簡單的#if DEBUG也不能工作,所有的定義在所有Debug *項目配置中檢查了DERBUG常量。

這是一件已知的事情嗎?我能做些什麼呢?

+0

你如何定義符號?如果它只是定義(沒有任何價值),不應該使用**#如果已定義**?此外,有時候符號被正確識別,但VS不能正確顯示,即不能正確顯示灰色。 – 2010-11-17 08:58:25

+0

我在項目屬性「構建」 - 條件編譯符號的字段中定義了符號。這不僅僅是可視化,條件代碼實際上不是在任何配置下編譯的,即使在正常的,未修改的調試版本配置(僅用於複製設置)中也不是正常的#if DEBUG代碼。 – 2010-11-17 09:45:28

+1

btw:**#如果已定義**不是C#中的有效指令。 – 2010-11-17 09:54:16

回答

0

的概念,你描述聽起來不錯。

也就是說,代碼使用:

#if VERSION10 ... #endif 

和項目配置定義VERSION10

和溶液配置設置被設置爲使用上面的項目的配置。

只要這些設置正確,我希望它能正常工作。

事實上,即使你說#if DEBUG沒有按預期工作,這表明某件事情已經非常糟糕。

我建議你嘗試了最簡單的情況下,以確保您undersatand如何設置它:創建一個新的最小的「hello world」的應用程序,只是有簡單的代碼,可以讓你分辨版本:

#if VERSION1 
    Console.WriteLine("Hello from version 1"); 
#else 
    Console.WriteLine("Hello from version 2"); 
#endif 

然後創建項目配置(「調試版本1」,「調試版本2」),看看您是否可以設置它們(一個定義了VERSION1,一個沒有),以在構建時獲取兩個輸出。

然後添加使用上述項目配置的解決方案配置,並構建它們以檢查它們在執行時是否打印正確的東西。

完成此操作後,您應該有一個工作系統(瞭解這些元素如何相互關聯),以便您可以將其應用於更復雜的項目。爲了應用它們,我建議刪除大部分項目/解決方案配置,然後從頭開始重新構建它們,以確保您知道該怎麼做 - 通常從第一個原則重建這些東西比試圖調整現有的「破碎'重新融入生活。

+0

某些未知的事實是錯誤的。我刪除了所有配置並重新設置,現在可以運行。 – 2010-11-21 14:22:58

0

C#中的條件編譯與C和C++不同。有關ConditionalAttribute課程的信息,請參閱here

例如:

doDebugOutput(); // unconditionally call the optional code 

Conditional["DEBUG"] 
void DoDebugOutput() 
{ 
    // do expensive debug-only output here 
}