2010-05-18 4 views

Répondre

5

Depuis définissant une condition à la balise assemblyname comme suggéré par Fredrik semble faire de mauvaise humeur Visual Studio, vous pouvez modifier le nom de montage plus tard dans le fichier csproj. L'utilisation du Choose element est un peu comme une instruction if, de sorte qu'un nom peut être ajouté si une condition est remplie, comme indiqué ci-dessous.

Obtenir une sous-chaîne de par exemple DefineConstants dans un attribut de condition ne semble pas possible (selon MSDN) avec « MSBuild plain vanilla », mais on peut définir leurs propres objectifs de construction et de définir une propriété lors de la compilation avec un /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

Si vous chargez le fichier .csproj dans un éditeur de texte, vous pouvez contrôler la propriété AssemblyName:

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

Notez cependant que cela ne change pas seulement le nom du fichier, mais le nom d'assembly, qui pourrait signifier des ennuis si vous avez un autre code référençant l'assemblée.

Je n'ai jamais fait cela moi-même, donc je ne peux pas vraiment dire à quel point l'idée est bonne ou mauvaise.

+0

Comment puis-je entrer une condition pour mon propre symbole, comme 'NO_LOG' ou quelque chose au lieu d'une sélection de configuration? – Patrick

+0

@Patrick: mes compétences msbuild ne s'étendent pas aussi loin. Ces constantes vont dans la propriété 'DefineConstants', mais toutes vont dans la même valeur de propriété (' CONST1 = value; CONST2; CONST3') et malheureusement, il ne semble pas y avoir d'outil "contains" qui peut être utilisé dans Attributs 'Condition'. –

+0

Vérifiez ce fil: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/827eb72a-65fb-426c-862c-6095f71bd4bc –

1

Vous pouvez modifier le fichier csproj, qui est juste un fichier MSBuild qui contient « tâches ». Il y a une section dans le fichier csproj qui s'appelle 'AfterBuild'. Peut-être, vous pouvez ajouter une commande qui renomme votre fichier exe au nom de fichier de votre choix.
(Bien sûr, vous devrez décommenter cette section).

Peut-être quelque chose comme ceci:

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

Je n'ai pas travaillé dehors plus loin, mais vous devez remplir l'attribut Condition, de sorte que vous pouvez vérifier si le symbole conditionnel est défini ou non.

+0

N'a pas essayé, mais cela écrasera malheureusement une compilation existante. * Peut-être que je pourrais entrer un BeforeBuild et copier l'application existante si elle existe *. Comment entrer la condition si j'ai un symbole conditionnel personnalisé entré dans la balise 'DefineConstants' dans le fichier csproj? – Patrick

+0

Cela ne fonctionne pas pour moi. – Elmue

1

Aucune des réponses travaille ici pour moi.

Ils produisent des erreurs ou ne font rien.

Voici ma solution qui fonctionne dans VS2005 et je suppose que ce sera également travailler dans les nouvelles versions VS. Modifiez le fichier * .csproj comme ceci:

<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> 

Le résultat sera qu'une compilation 32 bits produit un fichier ProjectName_32.exe et une version 64 bits produit ProjectName_64.exe.

Veuillez noter la syntaxe étrange. Il ne doit pas y avoir de parenthèse autour de la condition if et le x86 ne doit pas être entre guillemets.

L'inconvénient de cette méthode est que vous ne pouvez pas démarrer votre Exe dans le débogueur plus parce que Visual Studio ne trouve pas le Exe qu'il a généré.Cela pourrait être résolu en remplaçant la commande 'move' par la commande 'copy' mais dans ce cas vous devrez copier l'Exe dans un autre répertoire car vous ne voulez sûrement pas avoir deux fois le même fichier dans le même répertoire.

Tout cela est en désordre. Il est vraiment incroyable que vous puissiez entrer dans le répertoire de sortie directement dans les paramètres du projet, mais pour faire quelque chose de vraiment basique en changeant le nom d'Exe, vous devez écrire un tel script maladroit qui a des effets secondaires laids. Honte à Microsoft!

Questions connexes