12

I need to build a C# project as either WinExe or Library depending on the project's configuration.

I've tried both of these methods with no luck:

1) In the general PropertyGroup:

<OutputType Condition=" '$(Configuration)' == 'Release' ">WinExe</OutputType> <OutputType Condition=" '$(Configuration)' == 'Debug' ">Library</OutputType>

2) In a conditional PropertyGroup:

<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <OutputType>WinExe</OutputType> </PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <OutputType>Library</OutputType> </PropertyGroup>

Neither of these methods work and the OutputType is always WinExe. The odd thing is that if I change all instances of WinExe to Library, then it's always Library. This is making me think that it is reading them successfully, but either in a strange order or that WinExe takes precedence over Library.

Any ideas?

Justin
  • 84,773
  • 49
  • 224
  • 367
Guy Danus
  • 746
  • 2
  • 11
  • 18
  • 2
    As long as your OutputType declaration appears after any others, thus overwriting it, what you have above should work. But it also needs to be prior to any import statements that contain further properties that are based on the value of $(OutputType) – Brian Kretzler Jul 29 '11 at 03:58
  • Do you want this to work in VS or is the command line only OK? – Sayed Ibrahim Hashimi Jul 30 '11 at 05:06

1 Answers1

17

In the top of your .csproj file you will have two sections that look a bit like this:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <OutputType>Library</OutputType>
  <!-- Other properties go here -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  <OutputType>Exe</OutputType>
  <!-- Other properties go here -->
</PropertyGroup>

Add your OutputType elements to these two conditional PropertyGroup sections and make sure that you remove all other OutputType elements - I've just tested it and it does exactly what you are asking for.

Yes this is very similar to what you have already done, but I know for a fact that the above method works because I've just tried it - my only guess is that something somewhere else in your build is messing things up.

Justin
  • 84,773
  • 49
  • 224
  • 367
  • Ah, what we did does seem to work fine. Visual studio just reports it incorrectly, but it does in fact build the correct output type. – Guy Danus Aug 05 '11 at 23:12