2009-06-04 5 views
1

J'ai récemment trouvé la nécessité de vérifier à compilation si: a) une certaine référence d'assemblage existe et peut être résolu avec succès, ou b) une certaine classe (dont le nom complet est connu) est définie. Ces deux situations sont équivalentes à mes fins, donc être en mesure de vérifier l'un d'entre eux serait assez bon. Est-il possible de le faire dans .NET/C#? Les directives du préprocesseur m'ont d'abord semblé être quelque chose qui pourrait aider, mais il semble qu'il n'a pas les capacités nécessaires.Vérification de l'existence d'une référence/type à la compilation dans .NET

Bien sûr, vérifier l'existence d'un type à l'exécution peut être fait assez facilement, mais malheureusement cela ne résoudra pas mon problème particulier dans cette situation. (Je dois pouvoir ignorer le fait qu'une certaine référence est manquante et donc revenir à une autre approche dans le code.)

Répondre

1

Je semble avoir trouvé une solution ici, mais pas précisément pour ce que j'espérais initialement.

Ma solution:

Ce que je fini par faire est la création d'une nouvelle configuration de construction, puis la définition d'une precompiler constante, que j'ai utilisé dans le code pour déterminer si l'utilisation de la référence, ou pour revenir à la approche alternative (garantie de travailler). Ce n'est pas entièrement automatique, mais c'est relativement simple et semble assez élégant - assez bon pour mes fins.

Alternative:

Si vous vouliez automatiser cela, il pourrait être fait à l'aide d'une commande de pré-construction qui exécute un script batch/petit programme pour vérifier la disponibilité d'une référence donnée sur la machine et puis met à jour un fichier contenant des constantes de précompilateur. Ceci cependant j'ai considéré plus d'effort qu'il valait la peine, bien qu'il ait pu être plus utile si j'avais plusieurs références indépendantes que je dois résoudre (vérifier la disponibilité).

1

Y a-t-il une raison pour laquelle vous ne pouvez pas ajouter de référence, puis utiliser une expression typeof? un type de l'assemblage pour vérifier qu'il est disponible?

var x = typeof(SomeTypeInSomeAssembly); 

Si l'assembly contenant SomeTypeInSomeAssembly n'est pas référencé et disponible, il ne sera pas compilé.

+0

Oui. Malheureusement, il doit être au moment de la compilation, sinon le compilateur tentera de compiler cette heure et verra qu'il est manquant. Bien sûr, je pourrais simplement définir mon propre type avec la même structure/signature, mais cela me semble très difficile. – Noldorin

1

Il semble que vous vouliez que le compilateur ignore une branche de code, ce qui n'est vraiment réalisable qu'en le cachant derrière un bloC#if. Est-ce que définir un compilateur constant et utiliser #if travail pour vos besoins?

#if MyConstant 
.... code here that uses the type .... 
#else 
.... workaround code .... 
#endif 

Une autre option serait de ne pas dépendre de l'autre classe à la compilation du tout, et utiliser la réflexion ou le mot-clé dynamique .NET 4.0 pour l'utiliser. Si cela sera appelé à plusieurs reprises dans un scénario perf-critique dans .NET 3.5 ou version antérieure, vous pouvez utiliser DynamicMethod pour générer votre code lors de la première utilisation au lieu d'utiliser la réflexion à chaque fois.

+0

C'est probablement plus proche de ce dont j'ai besoin. Je pensais moi-même en utilisant une directive #if avec un script de pré-construction qui définit une constante si et seulement si une certaine référence peut être résolue. – Noldorin

Questions connexes