web-dev-qa-db-fra.com

#if directive de préprocesseur pour les directives autres que DEBUG

Je sais que je peux utiliser des directives de préprocesseur pour vérifier le débogage/libération en procédant comme suit:

#if DEBUG
    //debug mode
#Elif
    //release mode
#endif

mais qu'en est-il de la vérification d'autres configurations, comme Test. Dans VB vous pouvez le faire:

#If CONFIG = "Release" Then
    'Release mode
#ElseIf CONFIG = "Test" Then
    'Test mode
#ElseIf CONFIG = "Debug" Then
    'Debug mode
#End If

Donc, ma question est en C #, comment puis-je vérifier le mode Test? J'ai du code que je veux exécuter si je suis en Debug AND Test, mais pas en mode Release, donc spécifiquement, j'ai besoin d'un moyen de vérifier s'il n'est pas en mode Release. En VB je ferais ceci:

#If Not CONFIG = "Release" Then
    'Do something here for every configuration that is not Release
#End If
35
Johnie Karr

C'est la même chose que pour DEBUG, en supposant que vous avez défini une configuration de build qui répertorie TEST in la zone de texte "Symboles de compilation conditionnelle" (sous Propriétés du projet> onglet Générer; il s'agit d'une liste délimitée par des espaces).

Pour le code que vous souhaitez uniquement exécuter dans la configuration de génération TEST:

#if TEST
// ...
#endif

Et pour le code que vous ne voulez pas exécuter dans la configuration de build TEST, vous pouvez soit #else ce qui précède, ou procédez comme suit:

#if !TEST
// ...
#endif
61
Joe White

Cliquez avec le bouton droit sur le nom du projet [nom du projet] que vous souhaitez utiliser la directive de précompilateur personnalisée.

Accédez à l'élément des propriétés, puis à l'onglet de génération.

vous devez ensuite y ajouter votre directive personnalisée dans la zone de texte. Par exemple, j'ai ajouté "Local" comme directive personnalisée, voir l'image ci-dessous

enter image description here

Vous pouvez maintenant utiliser la nouvelle directive du compilateur comme indiqué ci-dessous dans votre (en C #)

  #if **Local**
    //TODO:Add your c# code here
  #endif
7
Ram

Il existe deux façons de gérer vos factorisations. Dans mon monde, nous avons utilisé quatre techniques principales:

  1. drapeaux du compilateur (#if)
  2. cours partiels
  3. implémentations distinctes
  4. Décisions d'exécution

Ainsi, par exemple, nous avons des configurations de construction pour, C # avec du code non managé, C # avec tout le code managé, C # pour silverlight. Dans le projet non géré C #, nous avons un symbole de compilation UNMANAGED, pour C # nous avons MANAGED et pour le silverlight nous avons SILVERLIGHT. Cela me permet d'injecter de petites tâches dans le code et de partager les mêmes fichiers sur tous les projets. Pas grave.

Pour les classes partielles, nous avons des fichiers .cs séparés pour chaque projet qui ont des implémentations du code frange. Cela est utilisé dans les cas où nous ne pouvions pas faire ce travail en ayant une classe abstraite comme classe parente avec la plupart de l'implémentation, puis le code frange dans des classes concrètes pour chaque cible. Cela fonctionne assez bien.

Pour les implémentations distinctes, nous reconnaissons qu'il y a peu de choses qui peuvent être partagées entre les bases de code et nous sommes mieux avec un code séparé. Ce n'est pas idéal, mais qu'il en soit ainsi.

Pour les vérifications d'exécution, c'est exactement cela. Plutôt que de rechercher DEBUG dans un #if, vous utilisez une vérification d'exécution pour un paramètre pour faire ce choix. À moins que vous n'ayez un énorme échafaudage de débogage, ce n'est pas un mauvais choix car il vous permet également de faire le débogage sur le terrain (mais vous pouvez avoir des contraintes de livraison qui l'empêchent).

Personnellement, j'essaie d'éviter les drapeaux du compilateur. Ils rendent le code plus difficile à lire. Honnêtement, cependant, il y a des moments où ils ont un sens. Nous avons eu des classes qui ne compileraient pas en clair uniquement à cause de la déclaration de classe (je pense que c'était ObservableCollection qui n'était pas disponible) et nous avons dû hériter d'autre chose. Tout le reste a bien fonctionné.

4
plinth

La réponse simple est

  • Allez dans Project -> [Project name] Properties-> Build
  • Définir coché [] Définir DEBUG

Vous pouvez maintenant jouer avec la directive prédécesseur DEBUG comme

#if DEBUG
...
#else
...
#endif
1
user3477720