Làm cách nào để chuyển đối số dòng lệnh vào ứng dụng WinForms?


105

Tôi có hai ứng dụng WinForms khác nhau, AppA & AppB. Cả hai đều đang chạy .NET 2.0.

Trong AppA, tôi muốn mở AppB, nhưng tôi cần chuyển đối số dòng lệnh vào nó. Làm cách nào để sử dụng các đối số mà tôi truyền trong dòng lệnh?

Đây là phương pháp chính hiện tại của tôi trong AppB, nhưng tôi không nghĩ rằng bạn có thể thay đổi điều này?

  static void main()
  {
  }

Câu trả lời:


118
static void Main(string[] args)
{
  // For the sake of this example, we're just printing the arguments to the console.
  for (int i = 0; i < args.Length; i++) {
    Console.WriteLine("args[{0}] == {1}", i, args[i]);
  }
}

Các đối số sau đó sẽ được lưu trữ trong argsmảng chuỗi:

$ AppB.exe firstArg secondArg thirdArg
args[0] == firstArg
args[1] == secondArg
args[2] == thirdArg

6
đầu vào: "anything.exe -v foo / lol nisp". Đầu ra: args [0] = "-v"; args [1] = "foo"; args [2] = "/ lol"; args [3] = "nisp"; Điều gì có thể dễ dàng hơn?
Callum Rogers

không thể tin rằng tôi đã nhìn thấy 'chuỗi [] args' đó rất nhiều lần sau cả năm và nó chưa bao giờ xảy ra với tôi nếu bây giờ vẫn chưa đến! haha
Niklas

1
Có vẻ như args [0] là đường dẫn đầy đủ và tên exe của ứng dụng đang chạy và args [1] là tham số đầu tiên.
Allan F

197

Cách tốt nhất để làm việc với args cho ứng dụng winforms của bạn là sử dụng

string[] args = Environment.GetCommandLineArgs();

Bạn có thể kết hợp điều này với việc sử dụng enum để củng cố việc sử dụng mảng xử lý cơ sở mã của bạn.

"Và bạn có thể sử dụng điều này ở bất kỳ đâu trong ứng dụng của mình, bạn không chỉ bị hạn chế sử dụng nó trong phương thức main () như trong ứng dụng bảng điều khiển."

Tìm thấy tại: ĐÂY


25
Phần tử đầu tiên trong mảng chứa tên tệp của chương trình đang thực thi. Nếu tên tệp không có sẵn, phần tử đầu tiên bằng String.Empty. Các phần tử còn lại chứa bất kỳ mã thông báo bổ sung nào được nhập trên dòng lệnh.
EKanadily

@docesam Điều đó đã giúp tôi rất nhiều, cảm ơn! Đang tự hỏi tại sao nó tiếp tục cố gắng tải chương trình dưới dạng văn bản.
Kaitlyn


Sau nhiều năm phát triển C #, tôi không bao giờ biết phương pháp này tồn tại. Đẹp.
CathalMF

1
có lợi ích khi sử dụng phương pháp này so với việc gửi các tham số main(string[] args)không?
Điều chỉnh

12

Bạn có thể lấy dòng lệnh của bất kỳ ứng dụng .Net nào bằng cách truy cập thuộc tính Environment.CommandLine. Nó sẽ có dòng lệnh dưới dạng một chuỗi duy nhất nhưng việc phân tích dữ liệu bạn đang tìm kiếm không quá khó.

Có một phương thức Main trống sẽ không ảnh hưởng đến thuộc tính này hoặc khả năng của một chương trình khác để thêm một tham số dòng lệnh.


26
Hoặc sử dụng Environment.GetCommandLineArgs () trả về một mảng chuỗi các lập luận giống như Main (string [] args)
Brettski

11

Xem xét bạn cần phát triển một chương trình mà qua đó bạn cần chuyển hai đối số. Trước hết, bạn cần mở lớp Program.cs và thêm các đối số trong phương thức Main như bên dưới và truyền các đối số này vào hàm tạo của biểu mẫu Windows.

static class Program
{    
   [STAThread]
   static void Main(string[] args)
   {            
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new Form1(args[0], Convert.ToInt32(args[1])));           
   }
}

Trong lớp biểu mẫu cửa sổ, hãy thêm một phương thức khởi tạo tham số chấp nhận các giá trị đầu vào từ lớp Chương trình như dưới đây.

public Form1(string s, int i)
{
    if (s != null && i > 0)
       MessageBox.Show(s + " " + i);
}

Để kiểm tra điều này, bạn có thể mở dấu nhắc lệnh và đi đến vị trí đặt exe này. Đặt tên tệp rồi tham số parmeter12. Ví dụ, hãy xem bên dưới

C:\MyApplication>Yourexename p10 5

Từ mã C # ở trên, nó sẽ nhắc một Hộp thư có giá trị p10 5.


7

Bạn sử dụng chữ ký này: (trong c #) static void Main (string [] args)

Bài viết này cũng có thể giúp giải thích vai trò của hàm main trong lập trình: http://en.wikipedia.org/wiki/Main_osystem_(programming)

Đây là một ví dụ nhỏ cho bạn:

class Program
{
    static void Main(string[] args)
    {
        bool doSomething = false;

        if (args.Length > 0 && args[0].Equals("doSomething"))
            doSomething = true;

        if (doSomething) Console.WriteLine("Commandline parameter called");
    }
}

4

Đây có thể không phải là giải pháp phổ biến cho mọi người, nhưng tôi thích Khung ứng dụng trong Visual Basic, ngay cả khi sử dụng C #.

Thêm tham chiếu đến Microsoft.VisualBasic

Tạo một lớp có tên WindowsFormsApplication

public class WindowsFormsApplication : WindowsFormsApplicationBase
{

    /// <summary>
    /// Runs the specified mainForm in this application context.
    /// </summary>
    /// <param name="mainForm">Form that is run.</param>
    public virtual void Run(Form mainForm)
    {
        // set up the main form.
        this.MainForm = mainForm;

        // Example code
        ((Form1)mainForm).FileName = this.CommandLineArgs[0];

        // then, run the the main form.
        this.Run(this.CommandLineArgs);
    }

    /// <summary>
    /// Runs this.MainForm in this application context. Converts the command
    /// line arguments correctly for the base this.Run method.
    /// </summary>
    /// <param name="commandLineArgs">Command line collection.</param>
    private void Run(ReadOnlyCollection<string> commandLineArgs)
    {
        // convert the Collection<string> to string[], so that it can be used
        // in the Run method.
        ArrayList list = new ArrayList(commandLineArgs);
        string[] commandLine = (string[])list.ToArray(typeof(string));
        this.Run(commandLine);
    }

}

Sửa đổi quy trình Main () của bạn để trông giống như thế này

static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var application = new WindowsFormsApplication();
        application.Run(new Form1());
    }
}

Phương pháp này cung cấp một số tính năng hữu ích bổ sung (như hỗ trợ SplashScreen và một số sự kiện hữu ích)

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;
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.