17

我对 .csproj 文件中的功能和条件完全陌生,因此感谢所有帮助。

我想要做的是检查当前配置中的特定编译器指令。一个示例如下所示:

<Choose>
    <When Condition= [current configuration has CONST-1 compiler constant defined] >
        ...
    </When>
    <When Condition= [current configuration has CONST-2 compiler constant defined] >
        ...
    </When>
</Choose>

我不知道这是否可能。如果有更好的方法来做我要求的事情,请告诉我。无论哪种方式,我都想测试独立于配置的条件。

编辑

我真正想要的是一个我可以轻松编辑的值,最好是在 Visual Studio 中,我也可以在不考虑配置的情况下检查它。我考虑了编译器常量,因为您可以在 VS 的项目属性中轻松更改它们。

4

3 回答 3

20

编译器常量设置为属性“DefineConstants”,因此您应该能够评估该属性。您的Choose语句需要在定义常量或目标内部的 PropertyGroups 之后进行。

<Choose>
    <When Condition="$(DefineConstants.Contains(CONST-1))">
        ...
    </When>
    <When Condition="$(DefineConstants.Contains(CONST-2))">
        ...
    </When>
</Choose>
于 2012-10-18T15:10:44.487 回答
9

如果您使用 MSBuild 4 或更高版本,我建议使用正则表达式而不是 String.Contains()。这样做的原因是即使 String.Contains() 通常运行良好,但在某些情况下您可能会遇到问题。

例如:

在代码中使用指令 CONST-1 和 CONST-12 时考虑大小写。但是,您决定只为当前构建定义 CONST-12 指令。即使没有定义 CONST-1,
现在也会Condition="$(DefineConstants.Contains('CONST-1'))"计算。True

解决方案RegularExpressions.RegEx

<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))">
...
</When>

总而言之,您可以小心确保不使用作为另一个子字符串的指令,或者您可以使用正则表达式而完全不用担心。

于 2014-12-02T22:10:36.237 回答
3

要添加到此处发布的其他答案,您可以解决此问题的另一种方法是用分号包装 DefineConstants 属性,以保证“;CONST-1;” 当且仅当定义了“CONST-1”常量时,才会包含在 DefineConstants 中。如果没有分号,您可以将 CONST-100 或 UNCONST-1,但不是 CONST-1 作为变量,并且它的计算结果为真。

<PropertyGroup>
    <DefineConstants2>;$(DefineConstants);</DefineConstants2>
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo>
    <Bar>$(Foo)</Bar> <!--It worked-->
</PropertyGroup>
于 2017-10-08T20:00:31.203 回答