C#:是否有可能有条件地从编译中排除某些文件?

时间:2013-01-05 20:03:29

标签: c# visual-studio-2010 silverlight

我想有条件地编译一个不包括特定类的项目。有可能吗?

更新

基本上我正在寻找的是通过不在特定类(存储在单独的.cs文件中)及其所有依赖项中编译来减少通过命令行指令生成的.xap文件的大小。

以下是MSDN建议手动执行此操作的方法。如果有办法以自动方式有条件地做到这一点,那将是一个完美的解决方案。

3 个答案:

答案 0 :(得分:5)

您可以使用ConditionalAttribute

  

指示编译器应忽略方法调用或属性,除非定义了指定的条件编译符号。

[Conditional("SomeCondition")]
public void WillCompileOnlyIfSomeConditionIsDefined()
{
}

另一种方法是使用preprocessor directives

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

答案 1 :(得分:4)

项目文件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 Framework

答案 2 :(得分:1)

使用Visual Studio Online进行构建时,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>