ฉันจะเริ่มโปรแกรมด้วยอาร์กิวเมนต์เมื่อทำการดีบักได้อย่างไร


110

ฉันต้องการดีบักโปรแกรมใน Visual Studio 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);
}

ฉันไม่ต้องการแสดงความคิดเห็นแล้วกลับเข้ามาใหม่เมื่อรวบรวม ฉันจะเริ่มโปรแกรมด้วยอาร์กิวเมนต์เมื่อทำการดีบักได้อย่างไร? ตั้งค่าเป็นโครงการเริ่มต้น



คำตอบ:


173

Project-><Projectname> Propertiesไปที่ จากนั้นคลิกที่แท็บและกรอกข้อมูลในการขัดแย้งของคุณในช่องที่เรียกว่าDebugCommand line arguments


1
อาร์กิวเมนต์สามารถ (ต้อง?) ถูกเติมลงในCommand line argumentsช่องว่างที่แยกออกมา (เช่นเดียวกับที่คุณทำโดยใช้บรรทัดคำสั่ง) ฉันไม่แน่ใจว่ามีวิธีอื่นหรือไม่ แต่คุณอาจเพิ่มสิ่งนี้ในคำตอบของคุณได้
d4Rk

2
ฉันมองหาคำตอบนี้มาหนึ่งสัปดาห์แล้ว! ขอบคุณ!
bird2920

อย่าลืมเครื่องหมายคำพูดรอบอาร์กิวเมนต์คำสั่งที่มีช่องว่างซึ่งทำให้ฉันไม่สนใจ
Dale

เป็นไปได้ไหมที่จะใช้พารามิเตอร์ที่มีชื่อเมื่อใช้ไลบรารีเช่นตัวแยกวิเคราะห์บรรทัดคำสั่ง เช่นฉันจะผ่านสิ่งที่ต้องการได้-url https://google.com -p pass -u userอย่างไร?
Animesh

54

ฉันขอแนะนำให้ใช้คำสั่งดังต่อไปนี้:

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

            Console.WriteLine(args[0]);
        }

โชคดี!


2
ทั้งสองคำตอบที่ดีฉันชอบคำตอบนี้มากขึ้นเท่านั้นเพราะมันง่ายต่อการเปลี่ยนแปลงหรืออ้างอิง (แม้ว่าคุณสมบัติจะไม่ยุ่งยาก: p อาจจะเป็นการคลิกเมาส์เพิ่มเติมหรือมากกว่านั้น)
Andrew Jackman

ฉันจะตรวจสอบสิ่งนี้ ขอบคุณ.
Kasper Hansen

1
ฉันเห็นด้วยกับโซลูชันของ Homam แม้ว่าจะเป็นโปรแกรมขนาดเล็ก แต่การตั้งค่าคุณสมบัติของโครงการ -> อาร์กิวเมนต์บรรทัดคำสั่งของแท็บดีบักเป็นวิธีที่ง่ายและตรงกว่าในการดีบักสำหรับแอปพลิเคชันขนาดใหญ่ที่ใช้ Directives จะมีประโยชน์และสวยงามกว่า
Sabitha

โซลูชันทั้งสองสมบูรณ์แบบ แต่ฉันชอบวิธีแก้ปัญหาของโฮมัมมากกว่า มันหรูหราไม่จำเป็นต้องมีคนจรจัดกับการตั้งค่าโครงการที่อาจลืมดูแล ใน seconf คิดว่าอาจลืมการเปลี่ยนแปลงรหัสที่ทำไป แต่อย่างน้อยก็ "มองเห็นได้"
IUnknown

4
Omho คำตอบนี้คือคำตอบ เป็นงานที่น่าเบื่อในการแก้ไขการตั้งค่าโปรเจ็กต์ทุกครั้งที่คุณต้องการดีบักด้วยชุดพารามิเตอร์บรรทัดคำสั่งใหม่ เมื่อเขียนแบบนี้คุณสามารถจดกรณีทดสอบทั้งหมดที่คุณต้องการตรวจสอบและสลับความคิดเห็นในแต่ละข้อเพื่อเปิดใช้งาน เร็วขึ้นมากและพิสูจน์ได้ว่ามีประโยชน์อย่างยิ่งหากจู่ๆคุณอยู่หน้า Visual Studio ในภาษาอื่น (ไม่ใช่ภาษาที่คุณคุ้นเคย) ซึ่งเป็นกรณีของฉันและถึงแม้ว่าฉันจะรู้ภาษา แต่การแปลก็แย่มากและ แม้แต่เจ้าของภาษาก็ไม่สามารถจัดการกับมันได้อย่างเหมาะสม : D
rbaleksandar

6

คำแนะนำของฉันคือใช้การทดสอบหน่วย

ในแอปพลิเคชันของคุณให้ทำตามขั้นตอนต่อไปนี้Program.cs:

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

และเช่นเดียวกันสำหรับ static Main(string[] args) .

หรือใช้Friend Assembliesโดยการเพิ่ม

[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

ฉันมาที่หน้านี้เพราะฉันมีข้อมูลที่ละเอียดอ่อนในพารามิเตอร์บรรทัดคำสั่งของฉันและไม่ต้องการให้เก็บไว้ในที่เก็บโค้ด ฉันใช้ตัวแปรสภาพแวดล้อมของระบบเพื่อเก็บค่าซึ่งสามารถตั้งค่าในแต่ละบิลด์หรือเครื่องพัฒนาได้ตามต้องการสำหรับแต่ละวัตถุประสงค์ การขยายตัวแปรสภาพแวดล้อมทำงานได้ดีในกระบวนการ Shell Batch แต่ไม่ใช่ Visual Studio

ตัวเลือกการเริ่มต้น Visual Studio:

Visual Studio Start Options

อย่างไรก็ตาม Visual Studio จะไม่ส่งคืนค่าตัวแปร แต่เป็นชื่อของตัวแปร

ตัวอย่างปัญหา:

ตัวอย่างข้อผิดพลาดใน Visual Studio

ทางออกสุดท้ายของฉันหลังจากลองหลาย ๆ อย่างที่นี่ใน SO คือการเขียนการค้นหาอย่างรวดเร็วสำหรับตัวแปร Environment ใน Argument Processor ของฉัน ฉันเพิ่มการตรวจสอบสำหรับ% ในค่าตัวแปรขาเข้าและหากพบให้ค้นหาตัวแปรสภาพแวดล้อมและแทนที่ค่า สิ่งนี้ใช้ได้ใน Visual Studio และใน Build Environment ของฉัน

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("%", ""));
                    }

สิ่งนี้ช่วยให้ฉันใช้ไวยากรณ์เดียวกันในไฟล์แบตช์ตัวอย่างของฉันและในการดีบักด้วย Visual Studio ไม่มีข้อมูลบัญชีหรือ URL ที่บันทึกไว้ใน GIT

ตัวอย่างใช้ในชุดงาน

ตัวอย่างไฟล์แบทช์


1

สำหรับVisual Studio Code :

  • เปิด launch.jsonไฟล์
  • เพิ่ม args ในการกำหนดค่าของคุณ:

"args": ["บางอาร์กิวเมนต์", "อีกอันหนึ่ง"],

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.