2009-10-02 5 views
14

Pourquoi le #IF Not DEBUG ne fonctionne-t-il pas de la manière dont je m'attendrais dans VB.NET?Directives du préprocesseur 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 

Mais, un fait const réglée manuellement:

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

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

Et, bien sûr, C# a le comportement attendu ainsi:

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

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

fonctionne bien pour moi, la première affiche simplement Debug en mode débogage et non Debug, pas de débogage en mode de sortie . Êtes-vous sûr de ne pas avoir quelque chose de «bizarre» dans les paramètres de votre projet? –

+0

Hmmm ... J'ai essayé à la fois avec VS2008 dans un projet ASP.NET existant, puis Snippet Compiler. Je vais essayer un nouveau projet de console et voir ce qui se passe. –

+0

C'était une nouvelle application de console j'ai essayé. –

Répondre

10

fin de compte, ce n'est pas tous de VB.NET qui est cassé - juste le CodeDomProvider (qu'utilisent à la fois ASP.NET et Snippet Compiler).

Compte tenu d'un simple fichier source:

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 

avec la version vbc.exe Compiler 9.0.30729.1 (.NET FX 3.5):

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

Ce sens ... Je ne l'ai pas définir DEBUG, donc il montre "Pas de débogage!".

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

Et, en utilisant 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! 

Ok, encore une fois - qui fait sens. Je n'ai pas défini DEBUG, donc il affiche "Pas de débogage". Mais, et si j'incluais les symboles de débogage?

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 ... Je n'ai pas défini DEBUG, mais peut-être l'a-t-il défini pour moi? Mais si c'est le cas, il doit l'avoir défini comme "1" - parce que je ne peux pas obtenir ce comportement avec une autre valeur. ASP.NET, en utilisant le CodeDomProvider, must define it the same way.

On dirait que le CodeDomProvider trébuche sur le stupide psuedo-logical operators de VB.NET.

Moral de l'histoire? #If Not n'est pas une bonne idée pour VB.NET.


Et maintenant, cette source est disponible, je peux verify that it does actually set it equal to 1 comme je m'y attendais:

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