代码之家  ›  专栏  ›  技术社区  ›  Mark Brackett Achilles Ram Nakirekanti

vb.net预处理器指令

  •  14
  • Mark Brackett Achilles Ram Nakirekanti  · 技术社区  · 15 年前

    为什么不呢 #IF Not DEBUG 按我在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
    

    但是,手动设置常量会:

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

    当然,C也有预期的行为:

    #if DEBUG
        Console.WriteLine("Debug");
    #endif
    
    #if !DEBUG
        Console.WriteLine("Not Debug");
    #endif
    // Outputs: Debug
    
    1 回复  |  直到 8 年前
        1
  •  10
  •   Mark Brackett Achilles Ram Nakirekanti    8 年前

    事实证明,这不是 全部的 对vb.net来说,它已经被破坏了——只有codedomProvider(ASP.NET和代码段编译器都使用)。

    给定一个简单的源文件:

    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
    

    使用vbc.exe版本9.0.30729.1(.net fx 3.5)编译:

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

    这是有意义的…我没有定义调试,所以它显示“不调试!”.

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

    并且,使用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!
    

    好吧,再说一遍-这是有道理的。我没有定义debug,所以它显示“not debug”。但是,如果我包含调试符号呢?

    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!
    

    嗯……我没有定义调试,但也许它为我定义了调试?但如果是这样的话,它一定把它定义为“1”——因为我不能用任何其他值来获得这种行为。ASP.NET,使用codedomProvider, must define it the same way .

    看起来codedomProvider被vb.net的愚蠢绊倒了 psuedo-logical operators .

    故事的寓意? #If Not 对于vb.net来说不是个好主意。


    现在有了这个来源,我可以 verify that it does actually set it equal to 1 正如我所料:

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