In den Lösungseigenschaften ist die Konfiguration für mein einziges Projekt auf "Freigeben" festgelegt.
Zu Beginn der Hauptroutine habe ich diesen Code und er zeigt "Mode = Debug". Ich habe auch diese beiden Zeilen ganz oben:
#define DEBUG
#define RELEASE
Teste ich die richtige Variable?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Mein Ziel ist es, verschiedene Standardeinstellungen für Variablen festzulegen, die auf dem Debug- und dem Release-Modus basieren.
c#
debugging
release
compiler-directives
NealWalters
quelle
quelle
Antworten:
DEBUG
/_DEBUG
sollte bereits in VS definiert sein.Entfernen Sie das
#define DEBUG
in Ihrem Code. Legen Sie Präprozessoren in der Build-Konfiguration für diesen bestimmten Build fest.Der Grund, warum "Mode = Debug" gedruckt wird, liegt an Ihrem
#define
und überspringt dann daselif
.Der richtige Weg zu überprüfen ist:
Nicht nachsehen
RELEASE
.quelle
#if
und nicht#ifdef
?#ifdef
, das für den Präprozessor von C / C ++ spezifisch ist. C # schreibt die Verwendung von vor#if
.Standardmäßig definiert Visual Studio DEBUG, wenn das Projekt im Debug-Modus kompiliert wird, und definiert es nicht, wenn es sich im Release-Modus befindet. RELEASE ist standardmäßig nicht im Release-Modus definiert. Verwenden Sie so etwas:
Wenn Sie etwas nur im Release-Modus tun möchten:
Es ist auch erwähnenswert, dass Sie
[Conditional("DEBUG")]
Attribute für Methoden verwenden können, die zurückkehrenvoid
, um sie nur auszuführen, wenn ein bestimmtes Symbol definiert ist. Der Compiler würde alle Aufrufe dieser Methoden entfernen, wenn das Symbol nicht definiert ist:quelle
Ich ziehe es vor, es so zu überprüfen, anstatt nach
#define
Anweisungen zu suchen :Mit der Einschränkung, dass Sie natürlich etwas im Debug-Modus kompilieren und bereitstellen können, aber den Debugger immer noch nicht angehängt haben.
quelle
#IF DEBUG
Debugging-Code verwenden, sollte dies nicht von Dauer sein. Für den Produktionscode stimme ich der Verwendung des oben genannten zu.#DEBUG
ist, dass diese if-Anweisung in Ihrem Code enthalten ist und immer überprüft wird, wo als#DEBUG
Antwort der Code entfernt wird, der zur Kompilierungszeit nicht anwendbar ist, sodass Sie keine Laufzeitprüfung haben und Ihre. exe (oder was auch immer Sie kompilieren) ist kleiner.Ich bin kein großer Fan des # if-Materials, besonders wenn Sie es über Ihre gesamte Codebasis verteilen, da es Ihnen Probleme gibt, wenn Debug-Builds erfolgreich sind, Release-Builds jedoch fehlschlagen, wenn Sie nicht vorsichtig sind.
Folgendes habe ich mir ausgedacht (inspiriert von #ifdef in C # ):
quelle
DebuggingService
keine statische Klasse ist und warum Sie eine Schnittstelle benötigen. Hat dies etwas mit der Verwendung mit einem IoC-Container zu tun?Die Methode
Debug.Assert
hat ein bedingtes AttributDEBUG
. Wenn es nicht definiert ist, wird der Anruf und die ZuordnungisDebug = true
werden eliminiert :Wenn
DEBUG
definiert ist,isDebug
wird auf gesetzttrue
(und an übergebenDebug.Assert
, was in diesem Fall nichts bewirkt).quelle
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Wenn Sie versuchen, die für den Build-Typ definierte Variable zu verwenden, sollten Sie die beiden Zeilen entfernen ...
... dies führt dazu, dass das #if (DEBUG) immer wahr ist.
Außerdem gibt es kein Standard-Symbol für die bedingte Kompilierung für RELEASE . Wenn Sie einen definieren möchten, gehen Sie zu den Projekteigenschaften, klicken Sie auf die Registerkarte Erstellen und fügen Sie dann RELEASE zum Textfeld Bedingte Kompilierungssymbole unter Allgemein hinzu Überschrift .
Die andere Möglichkeit wäre, dies zu tun ...
quelle
Entfernen Sie Ihre Definitionen oben
quelle
Leicht modifizierte (bastardisierte?) Version der Antwort von Tod Thomson als statische Funktion und nicht als separate Klasse (ich wollte sie in einer WebForm-Ansichtsbindung aus einer Viewutils-Klasse aufrufen können, die ich bereits aufgenommen hatte).
quelle
Stellen Sie sicher, dass Sie die DEBUG-Konstante in den Project Build-Eigenschaften definieren. Dies aktiviert die
#if DEBUG
. Ich sehe keine vordefinierte RELEASE-Konstante, was bedeuten könnte, dass alles, was sich nicht in einem DEBUG-Block befindet, im RELEASE-Modus ist.quelle
NameSpace
Methode
quelle
Ein Tipp, der Ihnen viel Zeit sparen kann - vergessen Sie das nicht, auch wenn Sie möchten
debug
unter Build-Konfiguration (im Menü vs2012 / 13 unter BUILD => CONFIGURATION MANAGER).Sie müssen auf das PUBLISH
Configuration
als solches achten :quelle
Da der Zweck dieser COMPILER-Anweisungen darin besteht, den Compiler anzuweisen, KEINEN Code, Debug-Code, Beta-Code oder möglicherweise Code einzuschließen, der von allen Endbenutzern benötigt wird, mit Ausnahme derjenigen der Werbeabteilung, dh #Define AdDept, die Sie möchten Sie können sie je nach Bedarf einschließen oder entfernen. Ohne Ihren Quellcode ändern zu müssen, wenn beispielsweise ein Nicht-AdDept in das AdDept übergeht. Dann müssen Sie nur noch die Direktive #AdDept in die Eigenschaftenseite der Compileroptionen einer vorhandenen Version des Programms aufnehmen und eine Kompilierung durchführen und wa la! Der Code des zusammengeführten Programms wird lebendig!.
Möglicherweise möchten Sie auch ein Deklarativ für einen neuen Prozess verwenden, der nicht zur Hauptsendezeit bereit ist oder der erst dann im Code aktiv sein kann, wenn es Zeit ist, ihn freizugeben.
Jedenfalls mache ich das so.
quelle
Ich musste über einen besseren Weg nachdenken. Mir wurde klar, dass # if-Blöcke in anderen Konfigurationen effektiv Kommentare sind (vorausgesetzt
DEBUG
oderRELEASE
; aber wahr mit jedem Symbol)quelle
Entfernen Sie die Definitionen und prüfen Sie, ob sich die Bedingung im Debug-Modus befindet. Sie müssen nicht überprüfen, ob sich die Direktive im Freigabemodus befindet.
Etwas wie das:
quelle