从MsBuild定义C#预处理器

3

在我的C#文件中,我想要有一个预处理条件,如下所示:

#if DEMO
    ShowSplash();
#endif

我正在从命令行运行此命令:

MSBuild MySolution.sln /p:Configuration=Release /p:Platform="Any CPU" /p:DEMO=1

然后,在 MyProject.csproj 文件中,我有以下内容:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DefineConstants>TRACE;DEMO=$(DEMO)</DefineConstants>
</PropertyGroup>

但是预处理器似乎跳过了我的闪屏代码。(我知道"Any CPU"和"AnyCPU"的区别,我从未改动过它,所以我非常确定Visual Studio不会关心空格。)

DEMO未定义?相同的结构似乎在其他项目类型(例如.wixproj)中有效。我错过了什么?


你尝试过在编辑了.csproj文件后进行清理/重建项目吗? - Bassie
不是,但我现在看到了这个警告:warning MSB3052: 编译器的参数无效,'/define:DEMO=1' - l33t
2
<DefineConstants>TRACE</DefineConstants> <DefineConstants Condition=" $(DEMO) == 1 ">$(DefineConstants);DEMO</DefineConstants> - user4003407
你可以尝试以不同的方式使用命令行,例如 MSBuild MySolution.sln /p:Configuration=Release /p:Platform="Any CPU" /p:Conditionals=DEMO。然后在你的项目中使用 <DefineConstants>TRACE;$(Conditionals)</DefineConstants>。(可能有效,也可能无效;我没有测试过...) - user2819245
@PetSerAl,可以这样做。似乎CSC不支持#if X=1。将这些内容放在答案中,我会接受的。 - l33t
1个回答

8

首先,你应该只定义(并在你的代码中测试)符号,比如:DEMO

然后,你应该有条件地将你的符号添加到现有符号(这些符号最终在项目属性中定义)中:

.csproj 文件中,在第一个 <DefineConstants> 项或创建另一个 <PropertyGroup> 部分之后,添加以下行:

<DefineConstants Condition="'$(DEMO)'=='1'">$(DefineConstants);DEMO</DefineConstants>

提示:这是一个经过测试的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接