2009-10-02 24 views
14

¿Por qué no funciona #IF Not DEBUG de la manera que esperaría en VB.NET?Directivas de preprocesador 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 

embargo, una constante configurar manualmente hace:

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

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

Y, por supuesto, C# tiene el comportamiento esperado, así:

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

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

funciona bien para mí, el primero se muestra acaba de depuración en modo de depuración y no de depuración, no de depuración en modo de lanzamiento . ¿Estás seguro de que no tienes algo "raro" en la configuración de tu proyecto? –

+0

Hmmm ... Lo he intentado tanto con VS2008 en un proyecto ASP.NET existente, y luego compilador de fragmentos. Probaré un nuevo proyecto de consola y veré qué sucede. –

+0

Era una nueva aplicación de consola que probé. –

Respuesta

10

Resulta que, no es todo de VB.NET que está roto, solo el CodeDomProvider (que tanto ASP.NET como Snippet Compilador usan).

Dado un archivo de fuente simple:

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 

Compilar con la versión 9.0.30729.1 vbc.exe (.NET FX 3.5):

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

Eso tiene sentido ... no lo hice define DEBUG, por lo que muestra "No depurar!".

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

Y, usando 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! 

bien, una vez más - que tiene sentido. No definí DEBUG, por lo que muestra "No depurar". Pero, ¿y si incluyo símbolos de depuración?

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 ... No definí DEBUG, pero ¿acaso lo definió para mí? Pero si lo hizo, debe haberlo definido como "1", porque no puedo obtener ese comportamiento con ningún otro valor. ASP.NET, utilizando CodeDomProvider, must define it the same way.

Parece que CodeDomProvider se está tropezando con el estúpido psuedo-logical operators de VB.NET.

¿Moral de la historia? #If Not no es una buena idea para VB.NET.


Y ahora que la fuente está disponible, puedo verify that it does actually set it equal to 1 como yo esperaba:

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