2009-08-11 4 views
1

J'ai une grande application que je peux construire via la ligne de commande. Je veux spécifier un drapeau qui me permet de le compiler dans l'un des deux modes, réel ou simulé.Utilisation du préprocesseur C# pour ajouter la référence

Donc, le principal problème est, comment puis-je utiliser le préprocesseur pour ajouter une référence par programmation?

Par exemple:

#if SIMULATED 
    include SimulatedFiles; 
    myFactory = new SimulatedFiles.simFactory(); 
#else 
    myFactory = new realFactory(); 
#endif 

Je ne veux pas de fichiers simulés à compilés dans mon application « réelle ». Comme il n'y a pas de directive "include" en C#, je suis bloqué sur la façon d'accomplir cela.

Répondre

10

Vous ne pouvez pas le faire via une instruction de préprocesseur C# car le langage ne prend pas en charge la notion de références via les macros du préprocesseur.

Ce que vous pouvez faire est d'utiliser un fichier msbuild et de modifier l'ensemble des références ajoutées en fonction des paramètres msbuild.

4

nant/msbuild et outil d'injection de dépendances avec configuration xml?

+0

+1 pour DI; le moyen le plus approprié pour résoudre cela. –

1

En C#, il n'y a pas de vrai préprocesseur, comme vous pouvez le lire sur le C# Preprocessor's documentation.

De la documentation (Souligné par l'auteur):

Alors que le compilateur n'a pas un préprocesseur séparé, les directives décrites dans cette section sont traités comme s'il y avait un; ces directives sont utilisées pour faciliter la compilation conditionnelle. Contrairement aux directives C et C++, vous ne pouvez pas utiliser ces directives pour créer des macros.

1

Les fichiers include sont-ils votre propre code source ou des DLL d'assembly tierces? Si elles sont vos propres sources, alors vous pouvez facilement utiliser la compilation conditionnelle pour supprimer le code "simulé" de votre build, exactement comme vous l'avez fait dans votre exemple (remplacez 'include' par 'using'). C'est une pratique courante avec les classes de débogage par exemple. Si vous ne "contrôlez" pas le code source de l'inclusion, vous pouvez toujours ajouter une référence de projet, mais si vous compilez conditionnellement tout le code qui utilise l'assembly, votre application ne tentera jamais d'accéder l'assembly, il n'a donc pas besoin d'être présent lorsque le code est en cours d'exécution.

(Une autre possibilité qui vous semble moins utile est d'écrire une version "fictive" de l'assembly référencé que vous expédiez à la place du "réel", ou un proxy qui appelle la DLL tierce réelle dans simulé S'il fournit les classes publiques et les méthodes que vous appelez, vous pouvez envoyer le mannequin au lieu de l'assemblage simulé à vos clients.)

Questions connexes