2009-10-02 7 views
14

Warum funktioniert #IF Not DEBUG nicht so, wie ich es in VB.NET erwarte?VB.NET Preprocessor Direktiven

#If DEBUG Then 
    Console.WriteLine("Debug") 
#End If 

#If Not DEBUG Then 
    Console.WriteLine("Not Debug") 
#End If 

#If DEBUG = False Then 
    Console.WriteLine("Not Debug") 
#End If 
' Outputs: Debug, Not Debug 

Aber ein manuell eingestellt const tut:

#Const D = True 
#If D Then 
    Console.WriteLine("D") 
#End If 

#If Not D Then 
    Console.WriteLine("Not D") 
#End If 
' Outputs: D 

Und natürlich, C# das erwartete Verhalten hat auch:

#if DEBUG 
    Console.WriteLine("Debug"); 
#endif 

#if !DEBUG 
    Console.WriteLine("Not Debug"); 
#endif 
// Outputs: Debug 
+0

funktioniert gut für mich, die erste zeigt nur Debug im Debug-Modus und Nicht Debug, Debuggen nicht in Release-Modus . Sind Sie sicher, dass Sie in Ihren Projekteinstellungen nicht etwas "Wierd" haben? –

+0

Hmmm ... Ich habe es sowohl mit VS2008 in einem bestehenden ASP.NET-Projekt versucht, und dann Snippet Compiler. Ich werde ein neues Konsolenprojekt ausprobieren und sehen, was passiert. –

+0

Es war eine neue Konsole App, die ich ausprobiert habe. –

Antwort

10

Es stellte sich heraus, es ist nicht alle von VB.NET, das ist gebrochen - nur der CodeDomProvider (der sowohl ASP.NET und Snippet Compiler verwenden).

eine einfache Quelldatei Gegeben:

Imports System 
Public Module Module1 
    Sub Main() 
     #If DEBUG Then 
      Console.WriteLine("Debug!") 
     #End If 

     #If Not DEBUG Then 
      Console.WriteLine("Not Debug!") 
     #End If 
    End Sub 
End Module 

mit vbc.exe Version kompilieren 9.0.30729.1 (.NET FX 3.5):

> vbc.exe default.vb /out:out.exe 
> out.exe 
    Not Debug! 

das Sinn macht ... habe ich nicht definiere DEBUG, so dass "Not Debug!" angezeigt wird.

> vbc.exe default.vb /out:out.exe /debug:full 
> out.exe 
    Not Debug! 

Und mit CodeDomProvider:

Using p = CodeDomProvider.CreateProvider("VisualBasic") 
    Dim params As New CompilerParameters() With { _ 
     .GenerateExecutable = True, _ 
     .OutputAssembly = "out.exe" _ 
    } 
    p.CompileAssemblyFromFile(params, "Default.vb") 
End Using 

> out.exe 
Not Debug! 

Okay, wieder - das macht Sinn. Ich habe DEBUG nicht definiert, daher wird "Not Debug" angezeigt. Aber was, wenn ich Debug-Symbole einschließe?

Using p = CodeDomProvider.CreateProvider("VisualBasic") 
    Dim params As New CompilerParameters() With { _ 
     .IncludeDebugInformation = True, _ 
     .GenerateExecutable = True, _ 
     .OutputAssembly = "C:\Users\brackett\Desktop\out.exe" _ 
    } 
    p.CompileAssemblyFromFile(params, "Default.vb") 
End Using 

> out.exe 
Debug! 
Not Debug! 

Hmm ... Ich habe DEBUG nicht definiert, aber vielleicht hat es für mich definiert? Aber wenn es so ist, muss es als "1" definiert worden sein - weil ich dieses Verhalten mit keinem anderen Wert bekommen kann. ASP.NET mit dem CodeDomProvider, must define it the same way.

Sieht aus wie der CodeDomProvider stolpert über VB.NET dumm psuedo-logical operators.

Moral der Geschichte? #If Not ist keine gute Idee für VB.NET.


Und jetzt, wo Quelle verfügbar ist, kann ich verify that it does actually set it equal to 1 wie ich erwartet hatte:

if (options.IncludeDebugInformation) { 
     sb.Append("/D:DEBUG=1 "); 
     sb.Append("/debug+ "); 
}