2010-05-18 2 views

ответ

5

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

Получение подстроку из, например DefineConstants в атрибуте состояние не представляется возможным (по 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> 
... 
11

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

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

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

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

+0

Как мне ввести условие для моего собственного символа, например, «NO_LOG» или что-то вместо выбора конфигурации? – Patrick

+0

@Patrick: мои навыки msbuild не растягиваются так далеко. Эти константы входят в свойство 'DefineConstants', но все они входят в одно и то же значение свойства (' CONST1 = value; CONST2; CONST3') и, к сожалению, похоже, что не существует «содержит» -оператор, который может использоваться в Атрибуты «Условие». –

+0

Проверьте эту тему: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/827eb72a-65fb-426c-862c-6095f71bd4bc –

1

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

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

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

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

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

+0

Не пробовал, но это, тем не менее, перезаписывает существующий компилятор. * Возможно, я мог бы ввести PreBuild и скопировать существующее приложение, если оно существует *. Как мне ввести условие, если у меня есть специальный условный символ, введенный в тег 'DefineConstants' в файле csproj? – Patrick

+0

Это не работает для меня. – Elmue

1

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

Они либо производят ошибки, либо ничего не делают.

Вот мое решение, которое работает в 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 в другой каталог, потому что вы не хотите, чтобы один и тот же файл был дважды в том же каталоге.

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

Смежные вопросы