我想有条件地编译一个不包括特定类的项目。有可能吗?
更新
基本上我正在寻找的是通过不在特定类(存储在单独的.cs文件中)及其所有依赖项中编译来减少通过命令行指令生成的.xap文件的大小。
以下是MSDN建议手动执行此操作的方法。如果有办法以自动方式有条件地做到这一点,那将是一个完美的解决方案。
答案 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>