web-dev-qa-db-fra.com

#Define à l'échelle de la solution

Existe-t-il un moyen de déclarer globalement un #define?

Comme je veux avoir un fichier qui a par exemple,

#define MONO

et je veux que tous les fichiers de code source sachent que cette directive de pré-processeur est définie. Comment pourrais-je y parvenir?

43
bevacqua

Mise à jour: Vous ne pouvez pas définir une solution «à l’échelle de la solution», mais la réponse ci-dessous est réalisable projet par projet. 

Vous les définissez dans les options de compilation ou les options de compilation:

http://msdn.Microsoft.com/en-US/library/76zdzba1(v=VS.80).aspx (VS2008) http://msdn.Microsoft.com/en- US/bibliothèque/76zdzba1 (v = VS.100) .aspx (VS2010)

voir la rubrique "Pour définir une constante personnalisée".

Mettre à jour

Documentation Microsoft sur les options de construction

Vous accédez aux options de construction en cliquant avec le bouton droit de la souris sur le projet et en sélectionnant les propriétés dans le menu.

Project Build Options

33
BJ Safdie

Je ne pense pas qu'il y ait un moyen de créer un à l'échelle de la solution #define. Vous pouvez en créer un pour chaque projet/assemblage, comme indiqué dans les autres réponses, mais vous devrez le faire pour chaque projet de la solution si vous avez besoin de all fichiers de code source pour en savoir plus .

4
Justin

Je connais la solution pour les projets C # (je ne l'ai pas testée pour d'autres projets)

Par exemple vous avez:

Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln

Créer le fichier SolutionDefines.targets dans le répertoire de la solution

Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|

dans chaque fichier de projet, ajoutez:

<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />

Dans Solution1\SolutionDefines.targets ajouter:

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
    </PropertyGroup>
</Project>

Dans Solution2\SolutionDefines.targets ajouter:

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
    </PropertyGroup>
</Project>

Dans ce cas, vous avez:

Pour Solution1 - tous les projets ont ajouté TRACING_BUILD define

Pour Solution2 - tous les projets ont ajouté ANOTHER_DEFINE define

Pour Solution3 - tous les projets - aucune définition ajoutée

Dans cette approche, vous devez stocker toutes les solutions dont la solution est définie dans des répertoires distincts.

3
Alexei Shcherbakov

en 2013, vous pouvez utiliser/define: x ou/d: x http://msdn.Microsoft.com/en-us/library/0feaad6z.aspx

1
Bas Smit

Créez une nouvelle configuration de solution dans Configuration Manager et assurez-vous que la case est cochée pour créer également de nouvelles configurations de projet. Ensuite, dans les propriétés Build de chaque projet, saisissez MONO dans la zone Symboles de compilation conditionnelle .

1
Mark Cidade

Il existe une solution supplémentaire, corrigez-moi si je me trompe:

Par exemple, ProjectA fait référence à ProjectB et ProjectsCommon contient une variable statique de base. Les deux projets font référence à ProjectsCommon

Code en ProjectsCommon:

[Assembly: InternalsVisibleTo("ProjectA")]

------------------------------------------

public class ConditionVariables
{
    public static bool IsABC { get; internal set; } = false;
}

Code en ProjectA:

#if ABC
    ProjectsCommon.ConditionVariables.IsABC = true;
#endif

Code en ProjectB:

if (ProjectsCommon.ConditionVariables.IsABC )
{
    // first scenario
}
else
{
    // second one
}

Cependant, le code dans ProjectA devrait être exécuté en premier. C'est probablement bien quand ProjectA est un projet bootstarapper.

0
Andrey K.