Okazuje się, to nic nie wszystko VB.NET, który jest uszkodzony - po prostu CodeDomProvider (którego używa zarówno ASP.NET, jak i kompilator skrytek).
Biorąc prosty plik źródłowy:
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
Kompilacja z vbc.exe wersji 9.0.30729.1 (.NET FX 3.5):
> vbc.exe default.vb /out:out.exe
> out.exe
Not Debug!
To ma sens ... Nie zdefiniuj DEBUG, więc pokazuje "Not Debug!".
> vbc.exe default.vb /out:out.exe /debug:full
> out.exe
Not Debug!
I, używając 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!
Dobra, jeszcze raz - to ma sens. Nie zdefiniowałem DEBUG, więc pokazuje "Not Debug". Ale co jeśli dołączę symbole debugowania?
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 ... Nie zdefiniowałem DEBUGA, ale może zdefiniował to dla mnie? Ale jeśli tak, to musiał zdefiniować go jako "1" - ponieważ nie mogę uzyskać takiego zachowania z jakąkolwiek inną wartością. ASP.NET, przy użyciu CodeDomProvider, must define it the same way.
Wygląda na to, że CodeDomProvider potknął się o głupią wersję VB.NET psuedo-logical operators.
Morał z historii? #If Not
nie jest dobrym pomysłem dla VB.NET.
I teraz, że źródło jest dostępne, mogę verify that it does actually set it equal to 1 jak się spodziewałem:
if (options.IncludeDebugInformation) {
sb.Append("/D:DEBUG=1 ");
sb.Append("/debug+ ");
}
działa dobrze dla mnie, pierwszy wyświetla tylko debugowania w trybie debugowania i nie Debug Nie Debugowanie w trybie Release . Czy jesteś pewien, że w ustawieniach projektu nie masz czegoś "dziwnego"? –
Hmmm ... Próbowałem go zarówno z VS2008 w istniejącym projekcie ASP.NET, a następnie Kompilator snippet. Spróbuję nowego projektu konsoli i zobaczę, co się stanie. –
To była nowa aplikacja konsolowa, którą próbowałem. –