डिबगिंग के दौरान मैं तर्कों के साथ एक कार्यक्रम कैसे शुरू करूं?


109

मैं विजुअल स्टूडियो 2008 में एक कार्यक्रम को डिबग करना चाहता हूं। समस्या यह है कि अगर यह तर्क नहीं मिलता है तो यह बाहर निकलता है। यह मुख्य विधि से है:

if (args == null || args.Length != 2 || args[0].ToUpper().Trim() != "RM") 
{
    Console.WriteLine("RM must be executed by the RSM.");
    Console.WriteLine("Press any key to exit program...");
    Console.Read();
    Environment.Exit(-1);
}

मैं इसे बाहर टिप्पणी नहीं करना चाहता और फिर संकलन करते समय वापस। डिबगिंग के दौरान मैं तर्कों के साथ कार्यक्रम कैसे शुरू कर सकता हूं? यह स्टार्टअप प्रोजेक्ट के रूप में स्थापित है।



जवाबों:


172

के पास जाओ Project-><Projectname> Properties। फिर Debugटैब पर क्लिक करें , और नामक टेक्स्टबॉक्स में अपने तर्क भरें Command line arguments


1
तर्क Command line argumentsअलग किए गए स्थान में भरे (जैसे ?) हो सकते हैं ( जैसे आप कमांड लाइन का उपयोग करके करेंगे)। मुझे यकीन नहीं है कि अगर अन्य तरीके हैं, लेकिन शायद आप इसे अपने उत्तर में जोड़ सकते हैं।
d4Rk

2
मैं एक हफ्ते से इस जवाब की तलाश में हूँ! धन्यवाद!
पक्षी २

रिक्त स्थान वाले कमांड तर्कों के आसपास भाषण के निशान मत भूलना, जिसने मुझे पकड़ा।
डेल

क्या कमांड लाइन पार्सर जैसे पुस्तकालयों का उपयोग करते समय नामांकित मापदंडों का उपयोग करना संभव है? जैसे मैं कुछ कैसे पास कर सकता हूं -url https://google.com -p pass -u user?
अनिमेष

54

मैं निम्नलिखित जैसे निर्देशों का उपयोग करने का सुझाव दूंगा :

        static void Main(string[] args)
        {
#if DEBUG
            args = new[] { "A" };
#endif

            Console.WriteLine(args[0]);
        }

सौभाग्य!


2
दोनों अच्छे उत्तर, मुझे यह केवल इसलिए अधिक पसंद है क्योंकि इसे बदलना या संदर्भित करना आसान है (हालांकि यह आवश्यक रूप से गुणों से गुजरने वाली परेशानी नहीं है: पी, शायद एक अतिरिक्त माउस क्लिक करें या तो)
एंड्रयू जैकमैन

मैं इस पर गौर करूंगा। धन्यवाद।
कास्पर हैनसेन

1
मैं होमम के समाधान से सहमत हूं। हालांकि एक छोटे से कार्यक्रम के लिए, प्रोजेक्ट गुण सेट करना -> डिबग टैब का कमांड लाइन तर्क डिबग करने का अधिक प्रत्यक्ष और आसान तरीका है, निर्देशों का उपयोग करने वाले बड़े अनुप्रयोगों के लिए अधिक उपयोगी और सुरुचिपूर्ण हैं।
सबिथा

दोनों ही उपाय सही हैं। लेकिन, मैं होमम द्वारा समाधान पसंद करता हूं। इसके सुरुचिपूर्ण को परियोजना के सेट के साथ छेड़छाड़ करने की आवश्यकता नहीं है, जिसे कोई भी ध्यान रखना भूल सकता है। एक seconf पर सोचा कि एक कोड परिवर्तन भी भूल सकता है, लेकिन वे कम से कम "दृश्यमान" हैं।
IUnknown

4
ओम्हो यह उत्तर है उत्तर। हर बार जब आप कमांड लाइन मापदंडों के एक नए सेट के साथ डिबग करना चाहते हैं, तो परियोजना सेटिंग्स को संपादित करना एक कठिन काम है। जब यह इस तरह लिखा जाता है, तो आप बस उन सभी परीक्षण मामलों को लिख सकते हैं जिन्हें आप जांचना चाहते हैं और इसे सक्रिय करने के लिए प्रत्येक पर टिप्पणियों को टॉगल करें। बहुत तेजी से और विशेष रूप से उपयोगी साबित होता है यदि आप अचानक एक अलग भाषा में विज़ुअल स्टूडियो के सामने हैं (न कि आपके साथ काम करने के लिए उपयोग किया जाता है), जो वास्तव में मेरा मामला है और यद्यपि मुझे भाषा पता है, अनुवाद बहुत ही भयानक है और यहां तक ​​कि एक देशी वक्ता भी इससे ठीक से नहीं निपट सकता। : D
rbaleksandar

6

मेरा सुझाव यूनिट टेस्ट का उपयोग करना होगा।

अपने आवेदन में निम्नलिखित स्विच करें Program.cs:

#if DEBUG
    public class Program
#else
    class Program
#endif

और उसी के लिए static Main(string[] args)

या वैकल्पिक रूप से मित्र विधानसभाओं को जोड़कर उपयोग करें

[assembly: InternalsVisibleTo("TestAssembly")]

अपने को AssemblyInfo.cs

फिर एक इकाई परीक्षण परियोजना और एक परीक्षण जो थोड़ा सा ऐसा दिखता है:

[TestClass]
public class TestApplication
{
    [TestMethod]
    public void TestMyArgument()
    {
        using (var sw = new StringWriter())
        {
            Console.SetOut(sw); // this makes any Console.Writes etc go to sw

            Program.Main(new[] { "argument" });

            var result = sw.ToString();

            Assert.AreEqual("expected", result);
        }
    }
}

इस तरह आप अपने कोड को संपादित करने या हर बार जब आप कुछ अलग जांचना चाहते हैं, तो मेनू सेटिंग को बदले बिना, एक स्वचालित तरीके से, तर्कों के कई इनपुट का परीक्षण कर सकते हैं।


3

मैं इस पृष्ठ पर आया क्योंकि मेरे पास मेरे कमांड लाइन मापदंडों में संवेदनशील जानकारी है, और उन्हें कोड रिपॉजिटरी में संग्रहीत नहीं करना चाहता था। मैं मूल्यों को धारण करने के लिए सिस्टम पर्यावरण चर का उपयोग कर रहा था, जिसे प्रत्येक उद्देश्य के लिए आवश्यकतानुसार प्रत्येक बिल्ड या डेवलपमेंट मशीन पर सेट किया जा सकता है। पर्यावरण चर विस्तार शेल बैच प्रक्रियाओं में बहुत अच्छा काम करता है, लेकिन विज़ुअल स्टूडियो नहीं।

दृश्य स्टूडियो प्रारंभ विकल्प:

विजुअल स्टूडियो स्टार्ट विकल्प

हालाँकि, Visual Studio चर मान नहीं लौटाएगा, लेकिन चर का नाम।

मुद्दे का उदाहरण:

Visual Studio में त्रुटि का उदाहरण

एसओ पर कई कोशिश करने के बाद मेरा अंतिम समाधान मेरे तर्क प्रोसेसर में पर्यावरण चर के लिए एक त्वरित खोज लिखना था। मैंने आने वाले वैरिएबल वैल्यू में% के लिए एक चेक जोड़ा है, और अगर यह पाया जाता है, तो पर्यावरण चर को देखते हुए और मूल्य को प्रतिस्थापित करें। यह Visual Studio, और मेरे बिल्ड वातावरण में काम करता है।

foreach (string thisParameter in args)
            {
                if (thisParameter.Contains("="))
                {
                    string parameter = thisParameter.Substring(0, thisParameter.IndexOf("="));
                    string value = thisParameter.Substring(thisParameter.IndexOf("=") + 1);

                    if (value.Contains("%"))
                    {   //Workaround for VS not expanding variables in debug
                        value = Environment.GetEnvironmentVariable(value.Replace("%", ""));
                    }

यह मुझे अपने नमूना बैच फ़ाइलों में समान सिंटैक्स का उपयोग करने की अनुमति देता है, और दृश्य स्टूडियो के साथ डीबगिंग में। जीआईटी में कोई खाता जानकारी या URL सहेजे नहीं गए।

उदाहरण बैच में उपयोग करें

बैच फ़ाइल उदाहरण


1

के लिए दृश्य स्टूडियो कोड :

  • launch.jsonफ़ाइल खोलें
  • अपने कॉन्फ़िगरेशन में आर्ग्स जोड़ें:

"आर्ग्स": ["कुछ तर्क", "एक और एक"],

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.