2013-01-05 75 views
4

我想有條件地編譯一個不包含特定類的項目。可能嗎?C#:是否可以有條件地從編譯中排除一些文件?

UPDATE:

基本上就是我要找的是降低由特定的類別沒有編制(存儲在單獨的.cs文件)和所有導致通過命令行指令.xap文件的大小他們的依賴。

這裏是如何MSDN建議做手工。如果有辦法以自動化的方式有條件地完成它,這將是一個完美的解決方案。

+0

取決於你的意思是「排除」是什麼。 –

+0

我已更新我的問題。 – jayarjo

+0

我不認爲MSIL代碼是那麼大。即使有數千個類,它也不應該超過幾兆字節。我會懷疑你有其他資源,有大filesezes。 – Euphoric

回答

3
項目

文件ProjectName.cproj是含有項目屬性和編譯器的指令的純xml文件。要包含的文件列在<ItemGroup>...</ItemGroup>標籤之間。可以有一個或多個這樣的<ItemGroup>列表。所以,你所要做的一切就是你要在有條件編譯成一個單獨的<ItemGroup>並添加一個條件作爲屬性放文件:

如果有一個屬性
<ItemGroup Condition=" '$(BUILD)' == 'IMAGE' "> 
    <Compile Include="PngEncoder\Adler32.cs" /> 
    <Compile Include="PngEncoder\CRC32.cs" /> 
    <Compile Include="PngEncoder\Deflater.cs" /> 
    <Compile Include="PngEncoder\DeflaterConstants.cs" /> 
    <Compile Include="PngEncoder\DeflaterEngine.cs" /> 
    <Compile Include="PngEncoder\DeflaterHuffman.cs" /> 
    <Compile Include="PngEncoder\DeflaterOutputStream.cs" /> 
    <Compile Include="PngEncoder\DeflaterPending.cs" /> 
    <Compile Include="PngEncoder\IChecksum.cs" /> 
    <Compile Include="PngEncoder\PendingBuffer.cs" /> 
    <Compile Include="PngEncoder\PngEncoder.cs" /> 
</ItemGroup> 

現在這組文件將只包括名稱爲BUILD,值爲"IMAGE"。屬性可以在項目文件本身來定義:

<PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion>8.0.50727</ProductVersion> 
    ... 
</PropertyGroup> 

或者通過命令行中傳遞:

msbuild ProjectName.cproj /p:BUILD=IMAGE 

msbuild.exe自帶.NET框架

5

可以使用ConditionalAttribute此:

表示到,除非指定的條件編譯符號定義一個方法調用或屬性應該被忽略的編譯器。

​​

一種替代方法是使用preprocessor directives

#if !SomeCondition 
    // will only compile if SomeCondition is false 
#endif 
+0

根據文檔,如果類是System.Attribute的後代,則此屬性僅在類上有效。 –

+0

@SeanCarpenter - 啊。不知道。答案已更新。 – Oded

+0

我試過了,但生成的.xap文件的大小沒有減少。然後,向每個文件添加指令(包括整個名稱空間)是非常麻煩的。 – jayarjo

1

在建立與Visual Studio的在線狀態屬性中的ItemGroup元素忽略。

如上所述here,使用When/Choose/Otherwise屬性的支持。

<Choose> 
    <When Condition="'$(Configuration)' == 'Debug With Project References'"> 
     <ItemGroup> 
     <ProjectReference Include="..\SomeProject\SomeProject.csproj"> 
     <Project>{6CA7AB2C-2D8D-422A-9FD4-2992BE62720A}</Project> 
     <Name>SomeProject</Name> 
     </ProjectReference> 
    </ItemGroup> 
    </When> 
     <Otherwise> 
     <ItemGroup> 
      <Reference Include="SomeProject"> 
      <HintPath>..\Libraries\SomeProject.dll</HintPath> 
      </Reference> 
     </ItemGroup> 
     </Otherwise> 
    </Choose> 
相關問題