2009-10-02 4 views
14

Почему не #IF Not DEBUG работать так, как я ожидал бы в VB.NET?Директивы Препроцессора 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 делает:

#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 
+0

отлично работает для меня, первый отображается только для отладки в режиме отладки и не отладки, а не отлаживать в режиме выпуска , Уверены ли вы, что в настройках вашего проекта нет чего-то «странного»? –

+0

Хммм ... Я пробовал это как с VS2008 в существующем проекте ASP.NET, так и с компилятором Snippet. Я попробую новый проект консоли и посмотрю, что произойдет. –

+0

Это было новое консольное приложение, которое я пробовал. –

ответ

10

Оказывается, это не все из 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, поэтому он показывает «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! 

Хм ... Я не определял 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+ "); 
} 
Смежные вопросы