2009-03-17 14 views
45

संभव डुप्लिकेट:
How to find out if a .NET assembly was compiled with the TRACE or DEBUG flagप्रोग्राम का पता लगाने के रिलीज/डीबग मोड (.NET)

संभव डुप्लिकेट:
How to idenfiy if the DLL is Debug or Release build (in .NET)

प्रोग्रामिंग के लिए सबसे आसान तरीका क्या है कि मौजूदा असेंबली डीबग या रिलीज मोड में संकलित की गई थी या नहीं?

उत्तर

97
Boolean isDebugMode = false; 
#if DEBUG 
isDebugMode = true; 
#endif 

आप डिबग और रिहाई के बीच अलग व्यवहार कार्यक्रम बनाता है तो आप इसे इस करना चाहिए चाहते हैं:

#if DEBUG 
    int[] data = new int[] {1, 2, 3, 4}; 
#else 
    int[] data = GetInputData(); 
#endif 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 

या आप यह कर सकता है अगर आप कार्यों की डिबग संस्करणों की कुछ चेकों क्या करना चाहते हैं इस तरह:

public int Sum(int[] data) 
{ 
    Debug.Assert(data.Length > 0); 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 
    return sum; 
} 

Debug.Assert रिलीज निर्माण में शामिल नहीं किया जाएगा।

+0

ओपी के बारे में JIT अनुकूलित निर्माण पूछ है? यदि ऐसा है, तो यह उत्तर गलत है। डीबग विशेषता को जेआईटी अनुकूलित बिल्ड या गैर-अनुकूलित में घोषित किया जा सकता है। –

11

मुझे आशा है कि यह आपके लिए उपयोगी हो:

public static bool IsRelease(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if ((d.DebuggingFlags & DebuggableAttribute.DebuggingModes.Default) == DebuggableAttribute.DebuggingModes.None) 
     return true; 

    return false; 
} 

public static bool IsDebug(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if (d.IsJITTrackingEnabled) return true; 
    return false; 
} 
+4

क्यों दोनों फ़ंक्शन में यह पंक्ति है: यदि (विशेषताएँ == शून्य] विशेषताएँ। लम्बाई == 0) सत्य वापस आती है; इस कोड के साथ कुछ गलत है। मैंने इसे +1 किया क्योंकि उत्तर ध्वज प्राप्त करने के लिए syntextual तरीके से एक वास्तविक प्रोग्रामेटिक तरीका प्रदान करता है। कभी-कभी थ्रेरे को यह जानने की आवश्यकता होती है कि डीबग मोड में एक कंपाइलर ध्वज के बजाय कोड के हिस्से के रूप में व्यक्त किया जा रहा है या नहीं। –

+1

डिबगेलएट्रिब्यूट मौजूद है यदि आप रिलीज मोड में संकलित करते हैं और "none" के अलावा किसी अन्य चीज़ पर डीबगऑटपुट चुनते हैं। तो, यह जवाब सही नहीं है। यह जेआईटी अनुकूलन ध्वज की भी तलाश नहीं करता है। मैन्युअल रूप से और प्रोग्रामेटिक रूप से अंतर को बताने के तरीके पर मेरी पोस्ट का संदर्भ लें - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I सामान्य मामले में इसकी कठिनाइयों पर @ डेव बी को स्थगित करें। हालांकि, आपका प्रश्न एक व्यापक था और, यदि आप परीक्षण करते समय अपना कोड अलग-अलग व्यवहार करना चाहते हैं, तो मुझे यह परीक्षण उपयोगी (VB.Net में) 'यदि सिस्टम। डायग्नोस्टिक्स.डिबगर.इसे एटेटेड फिर डूसमिंग' (जैसे कि एक फॉर्म अलग रूप से Behave है) ' –

संबंधित मुद्दे