2008-10-11 19 views
42

मेरे पास मेरे कंप्यूटर पर एक एप्लिकेशन स्थापित है। मुझे यह कैसे पता चलेगा कि इसे DEBUG मोड में संकलित किया गया था या नहीं?कैसे बताएं कि एक .NET अनुप्रयोग DEBUG या रिलीज मोड में संकलित किया गया था या नहीं?

मैं .NET Reflector उपयोग करने के लिए कोशिश की है, लेकिन यह कुछ भी विशिष्ट नहीं दिखाती है। यहाँ मैं क्या देख रहा है:

// Assembly APPLICATION_NAME, Version 8.0.0.15072 
Location: C:\APPLICATION_FOLDER\APPLICATION_NAME.exe 
Name: APPLICATION_NAME, Version=8.0.0.15072, Culture=neutral, PublicKeyToken=null 
Type: Windows Application 
+0

समानता सवाल, एक सवाल है, और कई, कई अलग अलग जवाब द्वारा प्रस्तावित समाधान की VB.Net संस्करण है।कॉम/प्रश्न/654450/प्रोग्रामेटिक-डिटेक्टिंग-रिलीज-डीबग-मोड-नेट http://stackoverflow.com/questions/798971/how-to-idenfiy-if-the-dll-is-debug-or-release -बिल्ड-इन-नेट http://stackoverflow.com/questions/194616/how-to-tell-if-net-app-was-compiled-in-debug-or-release-mode http://stackoverflow.com/questions/50900/best-way-to-detect-a-release-build-from-a-debug-build-net http://stackoverflow.com/questions/890459/asp-net- रिलीज-बिल्ड-बनाम-डीबग-बिल्ड – Kiquenet

उत्तर

29

मैं blogged इस एक लंबे समय पहले, और अगर यह अभी भी मान्य है या नहीं, लेकिन कोड कुछ की तरह है मैं नहीं जानता ...

private void testfile(string file) 
{ 
    if(isAssemblyDebugBuild(file)) 
    { 
     MessageBox.Show(String.Format("{0} seems to be a debug build",file)); 
    } 
    else 
    { 
     MessageBox.Show(String.Format("{0} seems to be a release build",file)); 
    } 
}  

private bool isAssemblyDebugBuild(string filename) 
{ 
    return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));  
}  

private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb) 
{ 
    bool retVal = false; 
    foreach(object att in assemb.GetCustomAttributes(false)) 
    { 
     if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute")) 
     { 
      retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled; 
     } 
    } 
    return retVal; 
} 
+0

यह काम पर प्रतीत होता है; हालांकि यह अपेक्षाकृत नाजुक लगता है। –

+0

जैसा कि मैंने कहा था, यह कुछ साल पहले जब मैंने जांच कार्य किया था ... कौन जानता है कि ढांचे में क्या बदल गया है, या यहां तक ​​कि मूल रूप से मैंने कितना खराब काम किया है। ;) – ZombieSheep

+0

अद्भुत कोड! मैंने डिलीवरी मोड में नहीं होने वाले अंतिम एप्लिकेशन को सत्यापित करने के लिए मेरी बिल्ड मशीन में एकीकृत एक कंसोल एप्लिकेशन बनाया है। – Samuel

9

आप वास्तव में सही रास्ते पर हैं।

[assembly: Debuggable(...)] 
+7

सच नहीं है; मैंने बस एक असेंबली की जांच की जिसे मैंने रिलीज मोड में बनाया था। यह अभी भी यह विशेषता थी: [विधानसभा: डीबग करने योग्य (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] –

+3

मैं रिलीज़ मोड में संकलित और मैं परावर्तक में यह देखा: [विधानसभा: डीबग करने योग्य (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] – chikak

+5

जब मैं एकत्रित न एक : डीबग मोड में विधानसभा, मैं यह देखने [विधानसभा: डीबग करने योग्य (DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] जब मैंने इसे रिलीज मोड में निर्माण, डिबग करने योग्य विशेषता में केवल IgnoreSymbolStoreSequencePoints ध्वज है, जैसा कि आप सभी का उल्लेख है। – Alric

2

के बारे में कैसे जेफ कुंजी के IsDebug सुविधा का उपयोग: आप परावर्तक में Disassembler विंडो में देखें, तो आप अगर यह डिबग मोड में बनाया गया था निम्न पंक्ति को कौन देखेगा? यह थोड़ा दिनांकित है, लेकिन चूंकि आपके पास परावर्तक है, इसलिए आप इसे संकुचित कर सकते हैं और ढांचे के किसी भी संस्करण में इसे पुन: संकलित कर सकते हैं। मैंने किया।

+1

+1, लेकिन उपयोगिता को कम करने की कोई आवश्यकता नहीं है - लेखक स्रोत कोड प्रदान करता है: http://www.sliver.com/Downloads/IsDebugSource.zip –

23

ZombieSheep के उत्तर गलत है।

इस डुप्लिकेट प्रश्न के लिए मेरा जवाब यहाँ है: How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

बहुत सावधान रहें - बस पर 'विधानसभा जिम्मेदार बताते हैं' 'डीबग करने योग्य' विशेषता की उपस्थिति के लिए विधानसभा प्रकट में देख है कि आप नहीं मतलब एक असेंबली है जो जेआईटी अनुकूलित नहीं है। असेंबली जेआईटी अनुकूलित हो सकती है लेकिन उन्नत बिल्ड सेटिंग्स के तहत असेंबली आउटपुट को 'पूर्ण' या 'पीडीबी-केवल' जानकारी शामिल करने के लिए सेट किया गया है - इस मामले में 'डिबग्रेबल' विशेषता मौजूद होगी।

अधिक जानकारी के लिए नीचे दिए गए मेरे पोस्ट का संदर्भ लें: How to Tell if an Assembly is Debug or Release और How to identify if the DLL is Debug or Release build (in .NET)

जेफ कुंजी के आवेदन सही ढंग से काम नहीं करता है, क्योंकि यह एक "डीबग" निर्माण के आधार पर करता है, तो DebuggableAttribute मौजूद है पहचानती है। डिबग्रेबल एट्रिब्यूट मौजूद है यदि आप रिलीज मोड में संकलित करते हैं और "none" के अलावा किसी अन्य चीज़ पर डीबगऑटपुट चुनते हैं।

तुम भी exaclty क्या "डीबग" बनाम "रिलीज़" का क्या मतलब है ... परिभाषित करने की जरूरत

  • तुम्हारा मतलब है कि आवेदन कोड अनुकूलन के साथ कॉन्फ़िगर किया गया है है?
  • तुम्हारा मतलब है कि आप इसे करने के लिए दृश्य स्टूडियो/JIT डीबगर संलग्न कर सकते हैं?
  • क्या आपका मतलब है कि यह DebugOutput उत्पन्न करता है?
  • क्या आपका मतलब है कि यह DEBUG निरंतर परिभाषित करता है? याद रखें कि आप सशर्त रूप से System.Diagnostics.Conditional() विशेषता के साथ विधियों को संकलित कर सकते हैं। : http: // stackoverflow
+0

विभिन्न पहलुओं और प्रकारों का विस्तृत विवरण प्रदान करने के लिए धन्यवाद "डीबग बिल्ड" का। अगली बार जब मैं कुछ iffy कार्यान्वयन देखता हूं, तो मैं लोगों को आपके ब्लॉग की ओर इंगित करना सुनिश्चित कर दूंगा। – ulty4life

2

यहाँ ZombieSheep

Stackoverflow में
Public Shared Function IsDebug(Assem As [Assembly]) As Boolean 
    For Each attrib In Assem.GetCustomAttributes(False) 
     If TypeOf attrib Is System.Diagnostics.DebuggableAttribute Then 
      Return DirectCast(attrib, System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled 
     End If 
    Next 

    Return False 
End Function 

Public Shared Function IsThisAssemblyDebug() As Boolean 
    Return IsDebug([Assembly].GetCallingAssembly) 
End Function