Pregunta

I am totally new to the functions and conditions in .csproj files so any and all help is appreciated.

What I want to do is check for a specific compiler directive in the current configuration. An example would be something like the following:

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

I don't know if this is even possible or not. If there is a better way to do what I am asking let me know that as well. Either way, I want to test for a condition independent of the configuration.

EDIT

What I really want is a value that I can edit easily, preferrably within Visual Studio, that I can also check regargless of the configuraiton. I thought about compiler constants because you can easily change them in the Project Properties in VS.

¿Fue útil?

Solución

Compiler constants are set into a property "DefineConstants" so you should just be able to evaluate that property. Your Choose statement needs to go after the PropertyGroups that define the constants or inside a target.

<Choose>
    <When Condition="$(DefineConstants.Contains(CONST-1))">
        ...
    </When>
    <When Condition="$(DefineConstants.Contains(CONST-2))">
        ...
    </When>
</Choose>

Otros consejos

In case you use MSBuild 4 or higher, I suggest using Regular Expression instead of String.Contains(). The reason for this is that even though String.Contains() usually works well, there are some cases you might get into problems.

For example:

Consider case when you use directives CONST-1 and CONST-12 in your code. However, you decide to define only CONST-12 directive for current build.
Now Condition="$(DefineConstants.Contains('CONST-1'))" evaluates to True even though CONST-1 is not defined.

Solution with RegularExpressions.RegEx:

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

To sum up, you can either be careful to make sure you don't use directive that is Substring of another or you can use the regular expression and not worry at all.

To add to the other answers posted here, another way you can approach this is to wrap the DefineConstants property with semicolons, to guarantee that ";CONST-1;" will be contained in DefineConstants if and only if the "CONST-1" constant is defined. Without the semicolons, you could have CONST-100, or UNCONST-1, but not CONST-1, as a variable and it would evaluate to true.

<PropertyGroup>
    <DefineConstants2>;$(DefineConstants);</DefineConstants2>
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo>
    <Bar>$(Foo)</Bar> <!--It worked-->
</PropertyGroup>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top