[c#] WinForms 응용 프로그램에 명령 줄 인수를 어떻게 전달합니까?

두 가지 WinForms 응용 프로그램, AppA 및 AppB가 있습니다. 둘 다 .NET 2.0을 실행하고 있습니다.

AppA에서 AppB를 열고 싶지만 명령 줄 인수를 전달해야합니다. 명령 줄에서 전달하는 인수를 어떻게 사용합니까?

이것이 AppB의 현재 주요 방법이지만 변경할 수 없다고 생각합니까?

  static void main()
  {
  }



답변

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

인수는 args문자열 배열에 저장됩니다 .

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


답변

winforms 앱에서 args로 작업하는 가장 좋은 방법은 다음을 사용하는 것입니다.

string[] args = Environment.GetCommandLineArgs();

코드베이스 전체에서 배열 사용을 강화하기 위해 열거 형 을 사용하여 이것을 결합 할 수 있습니다 .

“그리고이 기능은 응용 프로그램의 어느 곳에서나 사용할 수 있습니다. 콘솔 응용 프로그램에서와 같이 main () 메서드에서만 사용하도록 제한되지 않습니다.”

발견 위치 : HERE


답변

Environment.CommandLine 속성에 액세스하여 .Net 응용 프로그램의 명령 줄을 가져올 수 있습니다. 명령 줄은 단일 문자열로 표시되지만 찾고있는 데이터를 구문 분석하는 것은 그리 어렵지 않습니다.

Main 메서드가 비어 있으면이 속성이나 명령 줄 매개 변수를 추가하는 다른 프로그램의 기능에 영향을주지 않습니다.


답변

두 개의 인수를 전달해야하는 프로그램을 개발해야한다고 생각하십시오. 먼저 Program.cs 클래스 를 열고 아래와 같이 Main 메서드 에 인수를 추가 하고 이러한 인수를 Windows Form의 생성자에 전달해야합니다.

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

Windows Form 클래스에서 아래와 같이 Program 클래스 의 입력 값을받는 매개 변수화 된 생성자를 추가 합니다.

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

이를 테스트하기 위해 명령 프롬프트를 열고이 exe가있는 위치로 이동할 수 있습니다. 파일 이름을 지정한 다음 parmeter1 parameter2를 지정합니다. 예를 들어 아래를 참조하십시오.

C:\MyApplication>Yourexename p10 5

위의 C # 코드에서 값이있는 Messagebox를 프롬프트합니다 p10 5.


답변

다음 서명을 사용합니다. (c #에서) static void Main (string [] args)

이 기사는 프로그래밍에서 주요 기능의 역할을 설명하는데도 도움이 될 수 있습니다.
http://en.wikipedia.org/wiki/Main_function_(programming)

다음은 여러분을위한 간단한 예입니다.

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


답변

이것은 모든 사람에게 인기있는 솔루션은 아니지만 C #을 사용하는 경우에도 Visual Basic의 Application Framework를 좋아합니다.

다음에 대한 참조 추가 Microsoft.VisualBasic

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

}

Main () 루틴을 다음과 같이 수정하십시오.

static class Program
{

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

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

이 메서드는 몇 가지 추가 유용한 기능 (예 : SplashScreen 지원 및 몇 가지 유용한 이벤트)을 제공합니다.

public event NetworkAvailableEventHandler NetworkAvailabilityChanged;d.
public event ShutdownEventHandler Shutdown;
public event StartupEventHandler Startup;
public event StartupNextInstanceEventHandler StartupNextInstance;
public event UnhandledExceptionEventHandler UnhandledException;


답변