Можно ли сказать Visual Studio производить другое имя EXE-файла в зависимости от того, если определенный символ условной компиляции установлен?
Поскольку определение условия в теге assemblyname, как предложил Фредрик, кажется, делает Visual Studio раздражительной, вы можете изменить имя сборки позже в файле csproj. Использование элемента Choose похоже на оператор if, поэтому имя может быть добавлено при выполнении условия, как показано ниже.
Получить подстроку из, например, DefineConstants
в атрибуте condition не представляется возможным (согласно MSDN) с "простым ванильным MSBuild", но можно определить свои собственные цели сборки и установить свойство при компиляции с помощью /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>
...
Если вы загрузите файл .csproj в текстовый редактор, вы сможете управлять свойством AssemblyName
:
<AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
<AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>
Обратите внимание, что это изменяет не только имя файла, но и имя сборки, что может означать проблемы, если у вас есть другой код, ссылающийся на сборку.
Я никогда не делал этого сам, поэтому не могу сказать, насколько хороша или плоха эта идея.
Вы можете редактировать файл csproj, который является просто файлом MSBuild, содержащим "задачи". В файле csproj есть секция, которая называется 'AfterBuild'.
Возможно, вы можете добавить туда команду, которая переименует ваш exe-файл в выбранное вами имя.
(Конечно, вам придется откомментировать этот раздел).
Возможно, что-то вроде этого:
<Target Name="AfterBuild">
<Copy SourceFiles="" DestinationFiles="" Condition="" />
<Delete Files="" Condition="" />
</Target>
Я не проработал это дальше, но вы должны дополнить атрибут Condition, чтобы можно было проверить, определен ли условный символ или нет.