views:

289

answers:

3

Can you tell Visual Studio to output a different name of an exe file depending on if a specific conditional compilation symbol is set?

+4  A: 

If you load the .csproj file into a text editor, you can control the AssemblyName property:

<AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
<AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>

Note though that this does not only change the file name, but the assembly name, which might mean trouble if you have other code referencing the assembly.

I never did this myself, so I can't really say how good or bad the idea is.

Fredrik Mörk
How do I enter a condition for my own symbol, such as `NO_LOG` or something instead of a Configuration selection?
Patrick
@Patrick: my msbuild skills do not stretch quite that far. Those constants go into the `DefineConstants` property, but all of them go into the same property value (`CONST1=value;CONST2;CONST3`) and unfortunately there does not seem to be any "contains"-operator that can be used in `Condition` attributes.
Fredrik Mörk
Check this thread: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/827eb72a-65fb-426c-862c-6095f71bd4bc
Hans Passant
@Fredrik: Since Visual Studio seems to break down if you add a condition to assemblyname this does not work. You can however move the Assemblyname tag to the propertygroup with the defined condition...
Patrick
A: 

You can edit the csproj file, which is just an MSBuild file which contains 'tasks'. There is a section in the csproj file which is called 'AfterBuild'.

Perhaps, you can add a command there which renames your exe file to the filename of your choice.
(Offcourse, You'll have to uncomment that section).

Perhaps something like this:

<Target Name="AfterBuild">
     <Copy SourceFiles="" DestinationFiles="" Condition="" />
     <Delete Files="" Condition="" />
</Target>

I haven't worked it out further, but you should complete the Condition attribute, so that you can check whether the conditional symbol is defined or not.

Frederik Gheysels
Didn't try it, but this will nevertheless unfortunately overwrite an existing compile. *Perhaps I could enter a BeforeBuild and copy the existing application if it exist*. How would I enter the Condition if I have a custom conditional symbol entered in the `DefineConstants` tag in the csproj file?
Patrick
A: 

Since defining a condition to the assemblyname tag as suggested by Fredrik seems to make Visual Studio cranky, you can change the assembly name later in the csproj file. Using the Choose element is kind of like an if statement, so a name can be appended if a condition is met, demonstrated below.

Getting a substring out of for instance DefineConstants in a condition attribute does not seem possible (according to MSDN) with "plain vanilla MSBuild", but one can define their own build targets and set a property when compiling with a /p:Tag=value (MSBuild command line reference)

  ...
  <Tag>true</Tag>
</PropertyGroup>
<Choose>
  <When Condition=" '$(Tag)' == 'true' ">
    <PropertyGroup>
      <AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
    </PropertyGroup>
  </When>
</Choose>
<ItemGroup>
...
Patrick
Btw, is this the right way to go if you found an answer to your question, to make it an answer and accept your own? Or should the question be edited and the answer that led you to your own answer be accepted..?
Patrick