2009-10-02 11 views
14

क्यों #IF Not DEBUG वीबी.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 

और, ज़ाहिर है, सी # अपेक्षित व्यवहार के रूप में अच्छी तरह से है:

#if DEBUG 
    Console.WriteLine("Debug"); 
#endif 

#if !DEBUG 
    Console.WriteLine("Not Debug"); 
#endif 
// Outputs: Debug 
+0

वर्क्स ठीक, पहले एक को प्रदर्शित करता है बस डीबग मोड में डिबग और नहीं डिबग, रिलीज मोड में डीबग नहीं । क्या आप वाकई अपने प्रोजेक्ट सेटिंग्स में कुछ "wierd" चल रहे हैं? –

+0

हमम ... मैंने इसे मौजूदा एएसपी.NET प्रोजेक्ट में VS2008 के साथ और फिर स्निपेट कंपाइलर में दोनों की कोशिश की है। मैं एक नया कंसोल प्रोजेक्ट आज़माउंगा और देखें कि क्या होता है। –

+0

यह एक नया कंसोल ऐप था जिसकी मैंने कोशिश की थी। –

उत्तर

10

बाहर है, यह नहीं सभी VB.NET का टूटा हुआ है - बस CodeDomProvider (जो एएसपी.नेट और स्निपेट कंपाइलर दोनों का उपयोग करता है)।

एक सरल स्रोत फ़ाइल को देखते हुए:

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 को परिभाषित करें, इसलिए यह दिखाता है "डीबग नहीं!"।

> 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! 

हम्म ... मैंने डेबग को परिभाषित नहीं किया है, लेकिन शायद यह मेरे लिए परिभाषित किया गया है? लेकिन अगर ऐसा होता है, तो इसे इसे "1" के रूप में परिभाषित करना होगा - क्योंकि मैं उस व्यवहार को किसी अन्य मूल्य से नहीं प्राप्त कर सकता। ASP.NET, CodeDomProvider का उपयोग करके, must define it the same way

ऐसा लगता है कि CodeDomProvider VB.NET के बेवकूफ psuedo-logical operators पर जा रहा है।

कहानी का नैतिक? #If Not वीबी.नेट के लिए एक अच्छा विचार नहीं है।


और अब है कि स्रोत उपलब्ध है, मैं verify that it does actually set it equal to 1 के रूप में मैं उम्मीद कर सकते हैं: मेरे लिए

if (options.IncludeDebugInformation) { 
     sb.Append("/D:DEBUG=1 "); 
     sb.Append("/debug+ "); 
} 
संबंधित मुद्दे