2010-03-11 12 views
39

क्या कोई चर या प्रीप्रोसेसर स्थिर है जो यह जानने की अनुमति देता है कि कोड विजुअल स्टूडियो के संदर्भ में निष्पादित किया गया है?यह पता लगाने के लिए कि सी # विंडोज फॉर्म कोड विजुअल स्टूडियो के भीतर निष्पादित किया गया है?

+0

आप चाहते हैं इस जानकारी जानना चाहते हैं कि आपके कोड यह डिबग जा रहा है? यदि हां एक मैक्रो है जो आपको बताता है कि क्या आपके एप्लिकेशन से डीबगर जुड़ा हुआ है तो संदर्भित करें: http://stackoverflow.com/questions/2188201/is-there-a-way-to-detect-if-a-debugger-is -एटेड-टू-ए-प्रोसेस-से-सी –

+0

सी # में आप इसका उपयोग कर सकते हैं: http://stackoverflow.com/questions/361077/c-clr-remote-debugger-how-to-wait-until-attached –

उत्तर

56

प्रयास करें Debugger.IsAttached या DesignMode संपत्ति या ProcessName या एक संयोजन मिलता है, के रूप में उपयुक्त

Debugger.IsAttached // or          
LicenseUsageMode.Designtime // or 
System.Diagnostics.Process.GetCurrentProcess().ProcessName 

यहाँ एक sample

public static class DesignTimeHelper { 
    public static bool IsInDesignMode { 
     get { 
      bool isInDesignMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime || Debugger.IsAttached == true; 

      if (!isInDesignMode) { 
       using (var process = Process.GetCurrentProcess()) { 
        return process.ProcessName.ToLowerInvariant().Contains("devenv"); 
       } 
      } 

      return isInDesignMode; 
     } 
    } 
} 
+0

डीबगर के लिए +1.एएसएटेड –

+6

प्रक्रिया पर पागल मेमोरी रिसाव को न भूलें। GetCurrentProcess() – Neil

+0

का निपटान करना याद रखें मेरे कोड में, मैंने यह जानने के लिए एक स्थिर बूल वैरिएबल जोड़ा है जब IsInDesignMode को बुलाया गया था और दूसरा समारोह के परिणाम को पकड़ने के लिए।समारोह की शुरुआत में, मैं पहली कॉल का परिणाम वापस कर देता हूं। इसके साथ, फ़ंक्शन का भीतरी डिज़ाइन समय में एक बार और रनटाइम पर एक बार कॉल किया जाता है। मुझे कोई संघर्ष नहीं दिख रहा है जहां डिज़ाइन का समय रनटाइम के साथ विलय हो जाता है और जब आपके पास इस फ़ंक्शन में बड़ी संख्या में कॉल होते हैं तो यह बहुत तेज़ होता है। – Samuel

1

एक डिज़ाइनमोड प्रॉपर्टी है जिसे आप चेक कर सकते हैं लेकिन मेरे अनुभव में यह हमेशा सटीक नहीं होता है। आप यह देखने के लिए भी जांच सकते हैं कि निष्पादन योग्य है DevEnv.exe

look here लें। यह सवाल एक डुप्लिकेट कर सकता है लेकिन यह सब उस पर निर्भर करता है जो आप पूरा करने की कोशिश कर रहे हैं।

6

घटक के लिए DesignMode संपत्ति है। यह आसान है जब आप वीएस के डिजाइन व्यूअर का उपयोग करते हैं।

लेकिन जब आप विजुअल स्टूडियो में डिबगिंग के बारे में बात करते हैं तो आपको Debugger.IsAttached संपत्ति का उपयोग करने की आवश्यकता होती है। उसके बाद, आप मौजूदा प्रक्रिया की जांच करने के लिए उपयोग कर सकते

#if DEBUG 
#endif 

भी

+0

+ 1 Deugger.IsAttached –

3

मुझे लगता है कि अगर आपके एक्सटेंशन में WinForms डिजाइनर में निष्पादित किया जाता है निर्धारित करने के लिए सबसे आसान और सबसे विश्वसनीय तरीका है।

public static bool InVisualStudio() { 
    return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName); 
} 
1

मैं चाहे वह दृश्य में चल रहा है भेद करने के लिए इस कोड का उपयोग है स्टूडियो या अगर यह ग्राहकों को तैनात किया जाता है।

if (ApplicationDeployment.IsNetworkDeployed) { 
    // do stuff 
} else { 
    // do stuff (within Visual Studio) 
} 

उम्र के लिए मेरे लिए ठीक काम करता है। जब मैं विजुअल स्टूडियो (जैसे एप्लिकेशन आदि में लॉग इन करना) के अंदर कुछ तर्क छोड़ देता हूं।

+0

क्या यह नहीं लगता है [क्लिकऑन] (http://en.wikipedia.org/wiki/ClickOnce) का उपयोग किया जाता है (विजुअल स्टूडियो में "प्रकाशित" के रूप में छिपा हुआ)? यदि यह सामान्य [एमएसआई] (http://en.wikipedia.org/wiki/Windows_Installer) इंस्टॉलर बनाने के लिए एक सेटअप प्रोजेक्ट का उपयोग किया जाता है तो यह काम करेगा? –

15

DesignMode संपत्ति हमेशा सटीक नहीं होती है। हमने इस विधि का उपयोग किया है ताकि यह लगातार काम करता है:

protected new bool DesignMode 
    { 
     get 
     { 
      if (base.DesignMode) 
       return true; 

      return LicenseManager.UsageMode == LicenseUsageMode.Designtime; 
     } 
    } 

आपकी कॉल का संदर्भ महत्वपूर्ण है। यदि कुछ परिस्थितियों में किसी ईवेंट में चल रहा है तो हमने IDE में DesignMode को झूठा कर दिया है।

1

आप इस का उपयोग कर सकते हैं:

protected static bool IsInDesigner 
{ 
    get { return (Assembly.GetEntryAssembly() == null); } 
} 
2

मैं इस विस्तार विधि का उपयोग करें:

internal static class ControlExtension 
{ 
    public static bool IsInDesignMode(this Control control) 
    { 
     while (control != null) 
     { 
      if (control.Site != null && control.Site.DesignMode) 
       return true; 
      control = control.Parent; 
     } 
     return false; 
    } 
} 
संबंधित मुद्दे

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