2010-04-07 4 views
9

Ich habe mich gefragt, ob es einen Weg gibt, ganze Namespaces in C# bedingt zu kompilieren. Oder muss ich jede Quelldatei im Namespace explizit mit den Präprozessordirektiven dekorieren, um sie auszuschließen? In Unterversionen meiner Anwendung wird der Code in verschiedenen Namespaces einfach nicht benötigt und ich möchte, dass er ausgeschlossen wird.Bedingte Kompilierung ganzer Namespaces - C#

Vielen Dank im Voraus!

Antwort

4

Wenn sich Ihr Namespace in einer separaten Assembly befindet, die nichts anderes enthält, können Sie den Konfigurationsmanager für Ihre spezifische Unterversion verwenden und das Kontrollkästchen "Build" deaktivieren.

Wenn Sie andere Klassen in der Assembly haben, werden diese natürlich nicht erstellt oder eingefügt, und dann wäre die einzige Möglichkeit, mit Preprozessor-Deklarationen zu dekorieren.

1

Sie müssten die bedingte Kompilierungsanweisung in jede Datei einfügen. Es gibt keine Möglichkeit, einen gesamten Namespace als bedingt kompiliert zu markieren.

Als Michael notes in his answer besteht eine mögliche Lösung darin, den bedingten Code in ein separates Projekt (Assembly) aufzuteilen und diese Assembly nur für Konfigurationen zu senden, für die dies erforderlich ist. Dies hängt jedoch von der Art des bedingten Codes ab.

+0

Vielen Dank für diese zusätzliche Klarstellung. –

1

Sie können dies tun, indem Sie jede Datei dekorieren, oder Sie können es tun, indem Sie auswählen, welche Dateien enthalten sein sollen. Sowohl MSBuild als auch csc verfügen über Optionen zum Einschließen aller Dateien in einen Pfad, und MSBuild kann außerdem auf der Grundlage eines Attributs bedingte Elemente konditionieren (anstatt ein separates csproj pro Konfiguration zu benötigen).

Aber es ist wahrscheinlich einfacher, die Dateien dekorieren direkt

1

;-P hatte ich das gleiche Problem, und unter Verwendung von Richtlinien in jeder Datei wurde schließlich zu viel Arbeit; Daher habe ich begonnen, die bedingten <ItemGroup> Tags in der .csproj-Datei zu verwenden.

Zum Beispiel, wenn ich einige Dateien von einem Build ausschließen müssen, werde ich diese Dateien in einen neuen <ItemGroup> Abschnitt bewegen ...

<ItemGroup Condition=" '$(SlimBuild)' != 'true' "> 
... 
</ItemGroup> 

... und rufen msbuild.exe mit einem übereinstimmender Eigenschaftsparameter.

MSBuild.exe MyApp.msbuild /p:Configuration=Release /p:SlimBuild=true 

Sie könnten wahrscheinlich auch Platzhalter verwenden, um zukünftige Dateien einzuschließen.

<ItemGroup> 
    <Compile Include=".\SomePath\*.cs" /> 
</ItemGroup>