2010-04-07 29 views
9

我想知道是否有方法在C#中有條件地編譯整個命名空間。或者,我是否必須用預處理器指令顯式修飾名稱空間內的每個源文件以排除它?在我的應用程序的子版本中,各種名稱空間中的代碼根本就不是必需的,我希望排除它。有條件編譯整個命名空間 - C#

在此先感謝!

回答

4

如果你的命名空間是在一個單獨的組件,它不包含其他任何你可以使用配置管理器爲您的特定的子版本,並取消選中「生成」複選框。

如果你在程序集中有其他的類,雖然它們不會被顯式地構建或包含,然後唯一的方法是用預處理器聲明進行修飾。

1

您需要把條件編譯指令中的每個文件。沒有辦法將整個名稱空間標記爲有條件編譯。

由於Michael notes in his answer,一個可能的解決方案是將條件代碼分解爲單獨的項目(程序集),並僅將該程序集發送給需要它的配置;但這將取決於條件代碼的性質。

+0

感謝你爲這個額外的澄清。 – 2010-04-07 03:59:17

1

你可以通過裝飾每個文件來做到這一點,或者你可以通過選擇要包含的文件來做到這一點。兩者的MSBuild和CSC具有用於包括路徑下的所有文件的選項,和MSBuild的另外具有有條件地包括建立基於屬性的項目(而不是需要每個配置一個單獨的csproj)的能力。

但它可能是更容易裝點文件直接;-p

1

我有同樣的問題,並使用指令中的每個文件最終成爲了太多的工作;所以我開始在.csproj文件中使用條件<ItemGroup>標籤。

例如,如果我需要從構建中排除某些文件,我將這些文件移動到一個新的<的ItemGroup >節...

<ItemGroup Condition=" '$(SlimBuild)' != 'true' "> 
... 
</ItemGroup> 

...並調用msbuild.exe用匹配屬性參數。

MSBuild.exe MyApp.msbuild /p:Configuration=Release /p:SlimBuild=true 

你也可以使用通配符來包含將來的文件。

<ItemGroup> 
    <Compile Include=".\SomePath\*.cs" /> 
</ItemGroup>