2008-11-17 140 views
2

我有一個Web服務類,框架的其餘部分依賴於獲取其數據,但Web服務類需要具有不同的方法屬性,具體取決於它所處的環境。例如...MSBuild條件編譯

[SoapDocumentMethodAttribute("https://example",...)] 
public string Test() 
{ 
    //doSomething 
} 

看到「https://example」?這需要根據環境而改變。 AFAIK你不能讓該字符串爲運行時動態的,它必須以這種方式進行編譯。所以我試圖獲得它,這樣我有這個Web服務的多個CS文件,其中有不同的屬性URL在其中硬編碼,並且MSBuild在預編譯時交換它們。所以我會有一個用於測試的「Service.cs」,生產環境的「Service.cs.production」等等。

  • 這是做到這一點的最好方法,還是我錯過了一些我可以擁有一個CS來獨立處理環境的東西?
  • 爲了保留具有相同的類名稱和IntelliSense沒有想到的事情是不明確的,我把文件擴展名(「Service.cs」與「Service.cs.production」)分開。這是做到這一點的唯一方法嗎?
  • 考慮到上述所有情況都可以,而且我正在編譯一個「生產」配置,它是否可以編譯Service.cs.production 而不是 Service.cs,並且所有內容都是hunky-dorey?

謝謝!

回答

4

你可以使用條件註釋嗎?

#if TESTING 
     [SoapDocumentMethodAttribute(something)] 
#else 
     [SoapDocumentMethodAttribute(someotherthing)] 
#endif 

爲了您的測試配置,你會定義常量:

<DefineConstants>TESTING</DefineConstants> 
3

與定義的常量,並使用#if指令的同時,

您也可以編寫自定義生成任務 - > Target BeforeBuild,然後使用Engine.GlobalEngine.GetLoadedProject(「projpath」)中的Project對象。

現在,您可以在不同的環境下操作Project對象的屬性。

考慮在配置中添加平臺,以適應不同的環境。

這可能不是您正在尋找的答案,但需要考慮何時需要基於項目環境進行分叉構建。