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

jay*_*rjo 5 c# silverlight visual-studio-2010

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

更新:

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

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

Ode*_*ded 5

你可以使用ConditionalAttribute这个:

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

[Conditional("SomeCondition")]
public void WillCompileOnlyIfSomeConditionIsDefined()
{
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用预处理程序指令:

#if !SomeCondition
  // will only compile if SomeCondition is false
#endif
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`ConditionalAttribute`仅删除对该方法的调用.该方法仍然编译并包含在IL中. (2认同)

jay*_*rjo 5

项目文件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>
Run Code Online (Sandbox Code Playgroud)

现在,只有在定义了名称为BUILD和的属性时,才包括这组文件"IMAGE"。可以在项目文件本身中定义属性:

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.50727</ProductVersion>
    ...
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

或从命令行传入:

msbuild ProjectName.cproj /p:BUILD=IMAGE
Run Code Online (Sandbox Code Playgroud)

msbuild.exe.NET Framework附带。