Директивы препроцессора VB.NET

Почему #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

person Mark Brackett    schedule 02.10.2009    source источник
comment
У меня работает нормально, первый отображает только отладку в режиме отладки и не отладку, не отладку в режиме выпуска. Вы уверены, что в настройках вашего проекта не происходит ничего странного?   -  person Steven Robbins    schedule 02.10.2009
comment
Хммм ... Я пробовал это как с VS2008 в существующем проекте ASP.NET, так и с компилятором фрагментов. Я попробую новый консольный проект и посмотрю, что произойдет.   -  person Mark Brackett    schedule 02.10.2009
comment
Это было новое консольное приложение, которое я пробовал.   -  person Steven Robbins    schedule 02.10.2009
comment
Арх. Новое консольное приложение работает должным образом. Вот теперь я совсем запутался....   -  person Mark Brackett    schedule 02.10.2009
comment
Странный. Уверен, что кто-то не возился с настройками препроцессора для проекта?   -  person Steven Robbins    schedule 02.10.2009
comment
Это проект веб-сайта ASP.NET, поэтому он компилируется по требованию. Компилятор фрагментов также затронут ... единственное, о чем я могу думать, это проблема с Microsoft.VisualBasic.VBCodeProvider (который, насколько мне известно, используется как ASP.NET, так и компилятором фрагментов вместо vbc.exe). Ведется дополнительное расследование....   -  person Mark Brackett    schedule 02.10.2009


Ответы (1)


Оказывается, сломан не все VB.NET — только CodeDomProvider (который используют и ASP.NET, и Snippet Compiler).

Учитывая простой исходный файл:

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!

Это имеет смысл... Я не определял DEBUG, поэтому он показывает "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, поэтому он показывает «Не отладка». Но что, если я включу символы отладки?

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!

Хм... Я не определял DEBUG, но, может быть, он определил его для меня? Но если это так, он должен был определить его как «1», потому что я не могу получить такое поведение с любым другим значением. ASP.NET, используя CodeDomProvider, должен определять его таким же образом. .

Похоже, CodeDomProvider спотыкается о глупые псуэдологические операторы VB.NET.

Мораль истории? #If Not не очень хорошая идея для VB.NET.


Теперь этот источник доступен, и я могу убедиться, что он действительно устанавливает он равен 1, как я и ожидал:

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