Оказывается, это не все из 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+ ");
}
отлично работает для меня, первый отображается только для отладки в режиме отладки и не отладки, а не отлаживать в режиме выпуска , Уверены ли вы, что в настройках вашего проекта нет чего-то «странного»? –
Хммм ... Я пробовал это как с VS2008 в существующем проекте ASP.NET, так и с компилятором Snippet. Я попробую новый проект консоли и посмотрю, что произойдет. –
Это было новое консольное приложение, которое я пробовал. –