2009-07-11 4 views
5

मेनू बिल्ड के तहत "कॉन्फ़िगरेशन मैनेजर" की चर्चा करते हुएसी # - विजुअल स्टूडियो 2008 सशर्त संकलन में सक्षम है?

मेरे सी # कोड टिप्पणी करने के लिए इतना है कि, जबकि समाधान डीबग मोड में है बाहर टिप्पणी की कोड संकलन नहीं करता है एक रास्ता है, लेकिन अगर मैं बदल संकलन होगा यह रिलीज मोड के लिए?

मुझे यह क्यों चाहिए? कारण है कि मैं कोड रखना चाहता हूं जिसे रिलीज मोड में संकलित किया जाएगा लेकिन डीबग में नहीं है कि मुझे कुछ कोड मिला है जो मेरे विकास पीसी (कोड जो मेरे होस्ट से ईमेल भेजता है, आदि ...) से काम नहीं करेगा।

प्रकाशन से पहले मेरे कोड और असुविधा लाइनों के माध्यम से वापस चलाने के बजाय, मैं इसे स्वचालित होना चाहता हूं।

+0

वह शब्द जिसे आप "सशर्त संकलन" में ढूंढ रहे हैं। – Richard

+2

आपके अपडेट से, मुझे लगता है कि सशर्त संकलन वास्तव में आप जो चाहते हैं वह वास्तव में नहीं है। यह वही है जो आप पूछ रहे हैं, लेकिन आपको जो चाहिए वह नहीं। आपको एक कॉन्फ़िगरेशन की आवश्यकता है जो आपके DEV पर्यावरण के लिए चलता है, दूसरा QA में और दूसरा उत्पादन में। मैं वास्तव में इसके लिए एक विन्यास या ऑब्जेक्ट उन्मुख समाधान की तरफ झुकना होगा। –

+0

अह्ह्ह्ह, "सशर्त संकलन" ... इस शब्द के बारे में काफी नहीं सोच सका। – Chaddeus

उत्तर

10

क्या आप इस तरह कुछ ढूंढ रहे हैं?

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

आप केवल रिलीज़ मोड के बारे में परवाह है, तो आप उपयोग कर सकते हैं:

#if !DEBUG 
    Console.WriteLine("Release Mode"); 
#endif 
+2

मैं कहूंगा कि मेरा समाधान मेरे लिए इस समाधान पर लागू होता है। मैं इसकी सिफारिश नहीं करता। मैं पूरी तरह से समस्या को देखने का सुझाव दूंगा और देख रहा हूं कि बड़े मुद्दे को हल करने का कोई और तरीका है या नहीं। #if कथन या सशर्त विशेषताओं के बहुत सारे होने के कारण किसी भी रखरखाव प्रोग्रामर (या यहां तक ​​कि अपने आप को कुछ महीनों के समय में भी!) के लिए बहुत भ्रम पैदा करने का एक निश्चित तरीका है –

+2

आप क्यों मानते हैं कि DEBUG प्रतीक गलत तरीके से उपयोग किया जा रहा है ? इसे डिफ़ॉल्ट रूप से प्रत्येक प्रोजेक्ट में जोड़ा जाता है और फ्रेमवर्क इसका उपयोग करने के लिए होता है, इसलिए निश्चित रूप से इसका उपयोग किया जाना है। मुझे यह थोड़ा असामान्य लगता है कि आप केवल रिलीज मोड में कुछ कोड संकलित करेंगे और डीबग मोड नहीं (आमतौर पर यह दूसरी तरफ है), लेकिन रिलीज मोड और डीबग मोड के बीच अलग-अलग कोड संकलित करना पर्यावरण की एक जानबूझकर और उपयोगी विशेषता है। – BlueMonkMN

+0

कभी-कभी सशर्त संकलन ध्वज के साथ कुछ भी गलत नहीं है। मैं सहमत हूं कि जब आप एक मुट्ठी भर से अधिक उलझन में देखते हैं, हालांकि –

10

आप इस उद्देश्य के

उदा के लिए तरीकों (लेकिन कोड के अलग-अलग लाइनों) पर सशर्त विशेषता इस्तेमाल कर सकते हैं निम्नलिखित केवल DEBUG बिल्डों में संकलित किया जाएगा।

[Conditional("DEBUG")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

DEBUG प्रतीक पहले से ही परियोजना सेटिंग्स में निर्दिष्ट है। ताकि आप यह कर सकते हैं आप, एक रिलीज के निर्माण, कहते हैं "रिलीज़" के लिए अपने स्वयं के प्रतीक बनाने के लिए चाहते हैं:

[Conditional("RELEASE")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

हालांकि, मैं वापस कदम और एक उच्च से नए सिरे से अपनी समस्या को देख सलाह देते हैं स्तर क्योंकि मैं वास्तव में इस समाधान की सिफारिश नहीं करता।

+1

जो मैं चाहता था उसका सीधा समाधान नहीं, लेकिन जानना अच्छा है। धन्यवाद। – Chaddeus

-3

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि संकलक द्वारा टिप्पणियों को अनदेखा किया जाता है। अगर मैं .NET Reflector का उपयोग करके मेरा एक असेंबली देखता हूं, तो मुझे कोई टिप्पणी नहीं दिखाई देती है जो मुझे पता है।

ब्लूमोन्कएमएन की विधि संकलन मोड के आधार पर अलग-अलग कोड चलाने के लिए काम करेगी।

यदि आप संकलित (और अन्य चर) का उपयोग करने के तरीके के आधार पर अलग-अलग कोड चलाना चाहते हैं, तो PostSharp देखें। यह एक पोस्ट-कंपाइलिंग कंपाइलर है जो आपकी असेंबली के लिए कोड जोड़ और निकाल सकता है।

उदाहरण का उपयोग: - I प्यार मेरी परियोजनाओं के लिए विस्तृत डीबग और ट्रेस जानकारी रखने के लिए। - I से print या trace.write प्रत्येक विधि परिणाम या विधि कॉल के बाद बयान से नफरत है, क्योंकि यह अतिरिक्त डिबगिंग कोड काम करने वाले कार्य को अस्पष्ट करता है।

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

+0

प्रश्न को दोबारा पढ़ें। वह सशर्त संकलन चाहता था लेकिन उसे पता नहीं था कि यह अस्तित्व में है। समाधान के रूप में DI के लिए –

4

मैं ऑब्जेक्ट उन्मुख तकनीक के साथ आपकी समस्या को हल करने का प्रयास करूंगा। dependency injection का उपयोग करके, मैं एक कक्षा का निर्माण करूंगा जो आपके आवश्यक डीबग क्रियाएं करता है।

कुछ की तरह:

public class MyClass { 

    public MyClass(IDoOtherStuff stuffToDo) { 
     DoOtherStuff = stuffToDo; 
    } 

    private IDoOtherStuff DoOtherStuff { get; set; } 

    public void Do() { 
     DoOtherStuff.BeforeDo(); 

     // Blah blah blah.. 

     DoOtherStuff.AfterDo(); 
    } 
} 

public interface IDoOtherStuff { 
    void BeforeDo(); 
    void AfterDo(); 
} 

public class DebugOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { 
     Debug.WriteLine("At the beginning of Do"); 
    } 

    public void AfterDo() { 
     Debug.WriteLine("At the end of Do"); 
    } 
} 

public class ReleaseOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { } 
    public void AfterDo() { } 
} 

अब, आप एक Inversion of control कंटेनर Windsor, Unity, Ninject, या Spring.NET की तरह अपने विकास के वातावरण रिलीज पर्यावरण बनाम कॉन्फ़िगर करने के लिए उपयोग कर सकते हैं।

+0

+1, हालांकि इस समस्या का सही तरीका नहीं हो सकता है, मेरा मानना ​​है कि यह ऐसा कुछ है जो सबसे सशर्त संकलन मुद्दों का उत्तर देता है ... और यह भी बहुत अच्छी तरह से समझाया गया है। – Martin