Изменить имя exe в зависимости от условного символа компиляции - PullRequest
9 голосов
/ 18 мая 2010

Можете ли вы сказать Visual Studio выводить другое имя исполняемого файла в зависимости от того, установлен ли определенный символ условной компиляции?

Ответы [ 4 ]

11 голосов
/ 18 мая 2010

Если вы загрузите файл .csproj в текстовый редактор, вы можете управлять свойством AssemblyName:

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

Обратите внимание, что это не только меняет имя файла, но и имя сборки , что может вызвать проблемы, если у вас есть другой код, ссылающийся на сборку.

Я никогда не делал этого сам, поэтому я не могу сказать, насколько хороша или плоха идея.

5 голосов
/ 29 мая 2010

Поскольку определение условия для тэга имени сборки, как это было предложено Фредриком, кажется, делает Visual Studio капризным, вы можете изменить имя сборки позже в файле csproj. Использование элемента Choose похоже на оператор if, поэтому при выполнении условия можно добавить имя, как показано ниже.

Получение подстроки, например, DefineConstants в атрибуте условия, не представляется возможным (согласно MSDN ) с "простым ванильным MSBuild", но можно определить свои собственные цели сборки и установить свойство при компиляции с /p:Tag=value ( ссылка на командную строку MSBuild )

  ...
  <Tag>true</Tag>
</PropertyGroup>
<Choose>
  <When Condition=" '$(Tag)' == 'true' ">
    <PropertyGroup>
      <AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
    </PropertyGroup>
  </When>
</Choose>
<ItemGroup>
...
1 голос
/ 25 марта 2015

Ни один из ответов здесь не работает для меня.

Они либо выдают ошибки, либо ничего не делают.

Вот мое решение, которое работает в VS2005, и я полагаю, что оно также будет работать в более новых версиях VS. Отредактируйте файл * .csproj так:

<PropertyGroup>
  <PreBuildEvent>
  </PreBuildEvent>
  <PostBuildEvent>
    if $(PlatformTarget) == x86  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_32.exe"
    if $(PlatformTarget) == x64  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_64.exe"
  </PostBuildEvent>
</PropertyGroup>

В результате 32-битная компиляция создает файл ProjectName_32.exe, а 64-битная сборка - ProjectName_64.exe.

Обратите внимание на странный синтаксис. Вокруг условия if не должно быть скобок, а x86 не должно быть в кавычках.

Недостатком этого метода является то, что вы больше не можете запускать Exe в отладчике, поскольку Visual Studio не находит сгенерированный Exe. Эту проблему можно решить, заменив команду «move» на команду «copy», но в этом случае вам придется скопировать Exe в другой каталог, потому что, конечно, вы не хотите, чтобы один и тот же файл дважды находился в одном каталоге. 1016 *

Все это беспорядок. Действительно невероятно, что вы можете ввести выходной каталог непосредственно в настройках проекта, но чтобы сделать что-то действительно простое, например, изменить имя Exe, вы должны написать такой неуклюжий скрипт, который имеет неприятные побочные эффекты. Позор Microsoft!

1 голос
/ 18 мая 2010

Вы можете редактировать файл csproj, который является просто файлом MSBuild, который содержит «задачи». В файле csproj есть раздел, который называется AfterBuild.

Возможно, вы можете добавить туда команду, которая переименует ваш exe-файл в имя файла по вашему выбору.
(Конечно, вам придется раскомментировать этот раздел).

Возможно, что-то вроде этого:

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

Я не работал над этим дальше, но вы должны заполнить атрибут Condition, чтобы вы могли проверить, определен ли условный символ или нет.

...