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+ ");
}
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? –
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. –
Es war eine neue Konsole App, die ich ausprobiert habe. –