2009-06-04 6 views
1

Ich habe vor kurzem die Notwendigkeit gefunden zu überprüfen Kompilierzeit, ob entweder: a) eine bestimmte Assembly-Referenz existiert und erfolgreich gelöst werden kann, oder b) Eine bestimmte Klasse (deren voll qualifizierter Name bekannt ist) ist definiert. Diese beiden Situationen sind für meine Zwecke gleichwertig, also wäre es gut genug, nach einem von ihnen zu suchen. Gibt es eine Möglichkeit, dies in .NET/C# zu tun? Präprozessordirektiven erschienen mir zunächst als etwas, das helfen könnte, aber es scheint, dass es nicht die notwendige Fähigkeit hat.Überprüfung auf die Existenz eines Verweises/Typs zum Zeitpunkt der Kompilierung in .NET

Natürlich kann die Überprüfung der Existenz eines Typs zur Laufzeit leicht genug durchgeführt werden, aber das wird mein Problem in dieser Situation leider nicht lösen. (Ich muss in der Lage sein, die Tatsache zu ignorieren, dass eine bestimmte Referenz fehlt und somit auf einen anderen Ansatz im Code zurückgreift.)

Antwort

1

Ich habe hier eine Lösung gefunden, allerdings nicht genau für das, was ich ursprünglich erhofft hatte.

Meine Lösung:

Was ich am Ende da oben ist eine neue Build-Konfiguration erstellen und dann eine Precompilers Konstante definiert, die ich in Code verwendet, um zu bestimmen, ob die Referenz zu verwenden, oder auf dem zurückfallen alternativer (garantiert zu arbeiten) Ansatz. Es ist nicht vollautomatisch, aber es ist relativ einfach und scheint ziemlich elegant - gut genug für meine Zwecke.

Alternative:

Wenn Sie dies vollständig automatisieren wollen, es getan werden könnte, einen Pre-Build-Befehl, der ein Batch-Skript/small-Programm führt die Verfügbarkeit zu einer gegebenen Referenz auf der Maschine zu überprüfen und aktualisiert dann eine Datei, die Precompiler-Konstanten enthält. Dies berücksichtigte jedoch mehr Aufwand, als es wert war, obwohl es möglicherweise nützlicher gewesen wäre, wenn ich mehrere unabhängige Referenzen hätte, die ich auflösen muss (Verfügbarkeit prüfen).

1

Gibt es einen Grund, warum Sie keine Referenz hinzufügen und dann einen Ausdruck typeof verwenden können ein Typ aus der Baugruppe, um zu verifizieren, dass er verfügbar ist?

Wenn die Assembly, die SomeTypeInSomeAssembly enthält, nicht referenziert und verfügbar ist, wird dies nicht kompiliert.

+0

Ja. Leider muss es zur Kompilierzeit sein, sonst wird der Compiler versuchen, diese Zeit zu kompilieren und zu sehen, dass sie fehlt. Natürlich könnte ich meinen eigenen Typ mit der gleichen Struktur/Signatur definieren, aber das scheint mir sehr hack zu sein. – Noldorin

1

Es klingt, als ob der Compiler einen Codezweig ignorieren soll, was wirklich nur machbar ist, indem er hinter einem #if-Block versteckt wird. Möchten Sie eine Compiler-Konstante definieren und #if für Ihre Zwecke verwenden?

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

Eine andere Möglichkeit wäre überhaupt nicht zur Compile-Zeit auf der anderen Klasse abhängen, und verwenden Sie Reflektion oder .NET 4.0 dynamische Keyword, es zu benutzen. Wenn es in einem perf-kritischen Szenario in .NET 3.5 oder früher wiederholt aufgerufen wird, können Sie DynamicMethod verwenden, um Ihren Code bei der ersten Verwendung zu erstellen, anstatt jedes Mal die Reflektion zu verwenden.

+0

Das ist wahrscheinlich näher an dem, was ich brauche. Ich habe selbst darüber nachgedacht, eine #if-Anweisung zusammen mit einem Pre-Build-Skript zu verwenden, das genau dann eine Konstante definiert, wenn eine bestimmte Referenz aufgelöst werden kann. – Noldorin

Verwandte Themen