Làm cách nào để bắt đầu một chương trình với các đối số khi gỡ lỗi?


109

Tôi muốn gỡ lỗi một chương trình trong Visual Studio 2008. Vấn đề là nó thoát nếu nó không nhận được đối số. Đây là từ phương pháp chính:

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);
}

Tôi không muốn bình luận nó ra và sau đó quay lại khi biên dịch. Làm cách nào để khởi động chương trình với các đối số khi gỡ lỗi? Nó được đặt làm Dự án StartUp.



Câu trả lời:


170

Đi tới Project-><Projectname> Properties. Sau đó bấm vào Debugtab và điền các đối số của bạn vào hộp văn bản được gọi Command line arguments.


1
Các đối số có thể (phải?) Được điền vào Command line argumentskhoảng trống được phân tách (giống như bạn làm, sử dụng dòng lệnh). Tôi không chắc liệu có những cách khác không, nhưng có thể bạn có thể thêm điều này vào câu trả lời của mình.
d4Rk

2
Tôi đã tìm kiếm câu trả lời này trong một tuần! Cảm ơn bạn!
bird2920

Đừng quên các dấu giọng nói xung quanh các đối số lệnh có chứa khoảng trắng, điều đó đã khiến tôi không hiểu.
Dale

Có thể sử dụng các tham số được đặt tên khi sử dụng các thư viện như trình phân tích cú pháp dòng lệnh không? ví dụ: Làm thế nào tôi có thể vượt qua một cái gì đó như thế -url https://google.com -p pass -u usernào?
Animesh

54

Tôi sẽ đề nghị sử dụng các chỉ thị như sau:

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

            Console.WriteLine(args[0]);
        }

Chúc may mắn!


2
Cả hai câu trả lời tốt, tôi như thế này chỉ hơn bởi vì nó dễ dàng hơn để thay đổi hoặc tài liệu tham khảo (mặc dù nó không nhất thiết phải là một rắc rối đi qua thuộc tính: p, có lẽ một click chuột thêm hoặc lâu hơn)
Andrew Jackman

Tôi sẽ xem xét này. Cảm ơn.
Kasper Hansen

1
Tôi đồng ý với Giải pháp của Homam. Mặc dù đối với một chương trình nhỏ, việc thiết lập các đối số dòng lệnh của Project Properties -> Debug Tab là cách gỡ lỗi trực tiếp và dễ dàng hơn, đối với các ứng dụng lớn sử dụng Directives sẽ hữu ích và thanh lịch hơn.
Sabitha

Cả hai giải pháp đều hoàn hảo. nhưng, tôi thích giải pháp của Homam hơn. Thanh lịch của nó không cần phải mày mò với các vị trí dự án mà người ta có thể quên chăm sóc. Nghĩ rằng một người cũng có thể quên những thay đổi mã được thực hiện nhưng chúng ít nhất là "hiển thị".
IUnknown

4
Omho câu trả lời này là câu trả lời. Thật là một công việc tẻ nhạt khi chỉnh sửa cài đặt dự án mỗi khi bạn muốn gỡ lỗi với một bộ tham số dòng lệnh mới. Khi nó được viết như thế này, bạn có thể chỉ cần viết ra tất cả các trường hợp thử nghiệm bạn muốn kiểm tra và chỉ cần chuyển đổi các nhận xét trên mỗi trường hợp để kích hoạt nó. Nhanh hơn nhiều và tỏ ra đặc biệt hữu ích nếu bạn đột nhiên đứng trước Visual Studio bằng một ngôn ngữ khác (không phải ngôn ngữ bạn quen làm việc), đó chính xác là trường hợp của tôi và mặc dù tôi biết ngôn ngữ, bản dịch rất tệ và ngay cả một người bản ngữ cũng không thể đối phó với nó một cách đúng đắn. : D
rbaleksandar

6

Đề xuất của tôi là sử dụng Unit Test.

Trong ứng dụng của bạn, hãy thực hiện các chuyển đổi sau trong Program.cs:

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

và tương tự đối với static Main(string[] args).

Hoặc cách khác, sử dụng Hội bạn bè bằng cách thêm

[assembly: InternalsVisibleTo("TestAssembly")]

cho của bạn AssemblyInfo.cs.

Sau đó, tạo một dự án thử nghiệm đơn vị và một thử nghiệm trông giống như sau:

[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);
        }
    }
}

Bằng cách này, bạn có thể kiểm tra nhiều đầu vào của các đối số một cách tự động mà không cần phải chỉnh sửa mã của bạn hoặc thay đổi cài đặt menu mỗi khi bạn muốn kiểm tra điều gì đó khác.


3

Tôi đến trang này vì tôi có thông tin nhạy cảm trong các tham số dòng lệnh của mình và không muốn chúng được lưu trữ trong kho mã. Tôi đang sử dụng các biến Môi trường hệ thống để giữ các giá trị, có thể được đặt trên mỗi máy xây dựng hoặc phát triển nếu cần cho từng mục đích. Môi trường mở rộng biến hoạt động tốt trong các quy trình Shell Batch, nhưng không phải Visual Studio.

Tùy chọn bắt đầu Visual Studio:

Tùy chọn bắt đầu Visual Studio

Tuy nhiên, Visual Studio sẽ không trả về giá trị biến mà là tên của biến.

Ví dụ về vấn đề:

Ví dụ về lỗi trong Visual Studio

Giải pháp cuối cùng của tôi sau khi thử nhiều lần ở đây trên SO là viết một bản tra cứu nhanh cho biến Môi trường trong Bộ xử lý đối số của tôi. Tôi đã thêm kiểm tra% trong giá trị biến đến và nếu nó được tìm thấy, hãy tìm kiếm Biến môi trường và thay thế giá trị. Điều này hoạt động trong Visual Studio và trong Môi trường xây dựng của tôi.

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

Điều này cho phép tôi sử dụng cùng một cú pháp trong các tệp hàng loạt mẫu của mình và gỡ lỗi bằng Visual Studio. Không có thông tin tài khoản hoặc URL được lưu trong GIT.

Ví dụ sử dụng hàng loạt

Ví dụ về Batch File


1

Đối với mã Visual Studio :

  • Mở launch.jsontệp
  • Thêm args vào cấu hình của bạn:

"args": ["một số đối số", "một đối số khác"],

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.