Präprozessordirektiven für verschiedene Dateien in C #

8

Ich weiß, dass ich Präprozessordirektiven in C# verwenden kann, um die Kompilierung eines Teils des Codes zu aktivieren / deaktivieren.

Wenn ich eine Direktive in der gleichen Datei definiere, funktioniert es gut:

%Vor%

Ich werde jetzt in C++ verwendet, um all diese Konfigurationsdirektiven in eine einzige Headerdatei zu schreiben und sie in alle Dateien einzuschließen, in denen ich solche Anweisungen brauche.

Wenn ich das gleiche in C# mache, funktioniert etwas nicht:

%Vor%

Ich habe auch Folgendes versucht, aber scheint, dass ich keine Direktive in einem Namespace definieren kann:

%Vor%
  1. Was mache ich falsch?
  2. Was ist der richtige Weg, Präprozessor für verschiedene Dateien in zu verwenden? C# ?
  3. Gibt es einen besseren Weg, das zu tun?
Heisenbug 12.12.2012, 09:22
quelle

4 Antworten

9

In Ihrem .csproj gibt es einen Abschnitt:

%Vor%

Wenn Sie zusätzliche Präprozessoren haben möchten, können Sie sie dort hinzufügen.

Oder über die Eigenschaften des Projekts, die sie dort automatisch für Sie hinzufügen. In Eigenschaften unter der Registerkarte Erstellen.

    
SynerCoder 12.12.2012, 09:27
quelle
3

Sie können dies für das gesamte Projekt über Projekt | Eigenschaften tun.

Afaik gibt es keine Möglichkeit, Include-Dateien in C # zu verwenden. Für Gruppen von Dateien gibt es keine einfache Lösung.

    
Henk Holterman 12.12.2012 09:27
quelle
3

Anstatt die bedingte Kompilierung zu Ihren Dateien hinzuzufügen und Code-Blöcke hinzuzufügen, die Linq verwenden, und andere, die dies nicht tun. Ich hatte alle Datenzugriffslogik verschoben (d. H. Code, der zwei Implementierungen mit Linq und ohne), um Bibliotheken zu trennen.

z. Erstellen Sie Schnittstellen, die Ihre Hauptanwendung verwenden wird. Und erstellen Sie zwei Implementierungen dieser Schnittstellen - eine, die Linq verwendet, und eine andere, die nicht verwendet:

Im Hauptprojekt:

%Vor%

In Persistence.Linq.dll :

%Vor%

In Persistence.SomethingOther.dll :

%Vor%

Jetzt können Sie jede Implementierung von IUserRepository in Ihre Hauptanwendungsklassen injizieren.

    
Sergey Berezovskiy 12.12.2012 09:35
quelle
2

Es gibt keinen Sinn, #define auf usings anzuwenden, da Sie auf diese Weise die Verknüpfung der Bibliotheken nicht aufheben . Sie möchten vermeiden, in irgendeiner Bedingung zu verweisen.

In .NET gibt es keine Referenz für bedingte Assemblys (wenn nicht manuell, dynamisch).

Der Hauptnutzenpunkt von Präprozessordirektiven ist also nur enable/disable Teile des Codes in Namespaces .

    
Tigran 12.12.2012 09:29
quelle