2009-10-02 13 views
14

Dlaczego numer #IF Not DEBUG nie działa w sposób oczekiwany w VB.NET?Dyrektywy Preprocessor VB.NET

#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 

Ale ręcznie ustawić const robi:

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

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

I, oczywiście, C# ma oczekiwanego zachowania, a także:

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

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

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"? –

+0

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. –

+0

To była nowa aplikacja konsolowa, którą próbowałem. –

Odpowiedz

10

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+ "); 
}