VB.NET Preprocessor Directives

后端 未结 1 536
野性不改
野性不改 2021-02-19 04:07

Why doesn\'t #IF Not DEBUG work the way I\'d expect in VB.NET?

#If DEBUG Then
   Console.WriteLine(\"Debug\")
#End If

#If Not DEBUG Then
   Console         


        
1条回答
  •  孤城傲影
    2021-02-19 04:44

    Turns out, it's not all of VB.NET that's broken - just the CodeDomProvider (which both ASP.NET and Snippet Compiler use).

    Given a simple source file:

    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
    

    Compiling with vbc.exe version 9.0.30729.1 (.NET FX 3.5):

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

    That makes sense...I didn't define DEBUG, so it shows "Not Debug!".

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

    And, using 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, again - that makes sense. I didn't define DEBUG, so it shows "Not Debug". But, what if I include debug symbols?

    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...I didn't define DEBUG, but maybe it defined it for me? But if it did, it must have defined it as "1" - because I can't get that behavior with any other value. ASP.NET, using the CodeDomProvider, must define it the same way.

    Looks like the CodeDomProvider is tripping over VB.NET's stupid psuedo-logical operators.

    Moral of the story? #If Not is not a good idea for VB.NET.


    And now that source is available, I can verify that it does actually set it equal to 1 as I expected:

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

    0 讨论(0)
提交回复
热议问题