콘솔 응용 프로그램으로도 작동하는 Xamarin.Mac 응용 프로그램을 만드는 방법

6588 단어 MacOSXXamarinC#

Problem



GUI 어플리케이션으로서 통상의 플로우로 기동할 수 있다.
그러나 터미널 등에서 인수를 주어 시작했을 때는 그대로 표준 출력에 결과를 돌려 종료한다.
그런 것을 macOS 앱으로 하고 싶을 때에 참고해 주세요.
방법론으로서 Xamarin 특유라고 하는 것은 아니지만, 여기서는 Xamarin.Mac 를 사용해 해설합니다.

TL;DR



진입점Main.cs에서 분기합니다.

Prerequisites


  • Visual Studio for Mac 버전 7.3 (빌드 799)
  • Xamarin.Mac 4.0.0.214

  • 여기에서 만든 샘플은 GitHub:xamarin-mac-console-sample에 공개되어 있습니다.

    Solution



    프로젝트 만들기



    Xamarin.Mac 프로젝트를 적절하게 만듭니다. 자세한 절차는 생략하지만 창이 시작되도록 하십시오.


    Main.cs에서 인수 구문 분석


    Main.cs 대부분은 다음과 같아야 합니다.

    Main.cs
    using AppKit;
    
    namespace ConsoleSample
    {
        static class MainClass
        {
            static void Main(string[] args)
            {
                NSApplication.Init();
                NSApplication.Main(args);
            }
        }
    }
    
    NSApplication.Init를 호출하면 NSNotificationCenter.DefaultCenter 또는 NSFileManager.DefaultManager와 같은 NS * 시스템의 정적 인스턴스를 예약하고 사용할 수 있습니다. 즉 불리지 않으면 NS*계의 무엇이든 밖에 사용할 수 있거나 사용할 수 없거나 합니다. 대체로 사용할 수 없습니다.
    NSApplication.Main를 호출하면 응용 프로그램 시작 시퀀스로 들어가고 AppDelegate로 제어가 이동합니다. 그 전에 인수를 퍼스 해 처리를 분기하는 것이 본고의 목적으로 하는 곳입니다. 그렇게 하면 적당히 커맨드 라인 파서를 NuGet 경유로 넣게 되어, 자전으로 퍼스 하게 합시다. 여기에서는 dotnet-corefxlab 리포지토리 에서 제공되고 있는 System.CommandLine 를 사용합니다. 잡담이지만 대략 다음과 같이 될 것입니다.

    Main.cs
    using System;
    using System.CommandLine;
    using AppKit;
    
    namespace ConsoleSample
    {
        static class MainClass
        {
            static void Main(string[] args)
            {
                var input = string.Empty;
    
                ArgumentSyntax.Parse(args, syntax =>
                {
                    syntax.DefineOption("i|input", ref input, true, "Something interesting.");
    
                    syntax.ErrorOnUnexpectedArguments = false;
                });
    
                if (string.IsNullOrEmpty(input))
                {
                    NSApplication.Init();
                    NSApplication.Main(args);
                }
                else
                {
                    Console.WriteLine($"{input.Length} - {input}");
                }
            }
        }
    }
    

    프로젝트 설정에서 인수를 지정하여 디버깅하거나 터미널에서 인수를 주어 시작하는 등의 동작을 확인할 수 있습니다. 터미널에서 시작하려면 app/Contents/MacOS/에 진입 점이 있습니다.


    % ./ConsoleSample.app/Contents/MacOS/ConsoleSample -i Hello
    5 - Hello
    

    당연히, 아무것도 인수를 주지 않으면 윈도우가 일어나, 통상의 어플리로서 동작합니다.

    Conclusion


    Main.cs에서 시작하기 전에 무엇이든 할 수 있다는 것을 알았습니다.
    네이티브 라이브러리를 로드해 두거나 집약 예외 핸들러를 설치하거나와 나름대로의 어플리케이션을 만들 때에는 이 근처에서 여러가지 개입이 필요하게 된다고 생각합니다. 꼭 기억하십시오.

    좋은 웹페이지 즐겨찾기