Share via


콘솔 앱의 Xamarin.Mac 바인딩

C#에서 Apple 네이티브 API 중 일부를 사용하여 C#을 사용하여 사용자 인터페이스가 없는 헤드리스 애플리케이션을 빌드하려는 몇 가지 시나리오가 있습니다.

Mac 애플리케이션용 프로젝트 템플릿에는 호출 후 호출 NSApplication.Init()NSApplication.Main(args)포함되며 일반적으로 다음과 같습니다.

static class MainClass {
    static void Main (string [] args)
    {
        NSApplication.Init ();
        NSApplication.Main (args);
    }
}

Xamarin.Mac 런타임을 준비하는 호출Init, Cocoa 애플리케이션 기본 루프를 시작하는 호출 Main(args) 은 애플리케이션이 키보드 및 마우스 이벤트를 수신하고 애플리케이션의 기본 창을 표시하도록 준비합니다. 또한 호출 Main 은 Cocoa 리소스를 찾고, 토플벨 창을 준비하며, 프로그램이 애플리케이션 번들(확장 및 매우 구체적인 레이아웃이 있는 디렉터리에 .app 배포된 프로그램)의 일부가 될 것으로 예상합니다.

헤드리스 애플리케이션은 사용자 인터페이스가 필요하지 않으며 애플리케이션 번들의 일부로 실행할 필요가 없습니다.

콘솔 앱 만들기

따라서 일반 .NET 콘솔 프로젝트 형식으로 시작하는 것이 좋습니다.

다음과 같은 몇 가지 작업을 수행해야 합니다.

  • 빈 프로젝트를 만듭니다.
  • Xamarin.Mac.dll 라이브러리를 참조합니다.
  • 관리되지 않는 종속성을 프로젝트에 가져옵니다.

이러한 단계는 아래에 자세히 설명되어 있습니다.

빈 콘솔 프로젝트 만들기

새 .NET 콘솔 프로젝트를 만들고 . NET Core가 아닌 .NET인지 확인합니다. Xamarin.Mac.dll .NET Core 런타임에서 실행되지 않으므로 Mono 런타임에서만 실행됩니다.

Xamarin.Mac 라이브러리 참조

코드를 컴파일하려면 이 디렉터리에서 어셈블리를 Xamarin.Mac.dll 참조해야 합니다. /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/64bits/full

이렇게 하려면 프로젝트 참조로 이동하여 .NET 어셈블리 탭을 선택하고 찾아보기 단추를 클릭하여 파일 시스템에서 파일을 찾습니다. 위의 경로로 이동한 다음 해당 디렉터리에서 Xamarin.Mac.dll 선택합니다.

이렇게 하면 컴파일 시간에 Cocoa API에 액세스할 수 있습니다. 이 시점에서 파일의 맨 위에 추가하고 using AppKit 메서드를 호출할 NSApplication.Init() 수 있습니다. 애플리케이션을 실행하기 전에 한 단계만 더 있습니다.

관리되지 않는 지원 라이브러리를 프로젝트에 가져오기

애플리케이션이 실행되기 전에 지원 라이브러리를 Xamarin.Mac 프로젝트에 가져와야 합니다. 이렇게 하려면 프로젝트에 새 파일을 추가하고(프로젝트 옵션에서 추가를 선택한 다음, 기존 파일 추가) 이 디렉터리로 이동합니다.

/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/SDKs/Xamarin.macOS.sdk/lib

여기서 libxammac.dylib 파일을 선택합니다. 복사, 연결 또는 이동 중에서 선택할 수 있습니다. 나는 개인적으로 연결을 좋아하지만 복사도 작동합니다. 그런 다음 파일을 선택해야 하며 속성 패드(속성 패드가 표시되지 않는 경우 보기 패드 속성 선택)에서 빌드 섹션으로 이동하고 출력 디렉터리로 복사 설정을 최신인 경우 복사로 설정합니다.>>

이제 Xamarin.Mac 애플리케이션을 실행할 수 있습니다.

bin 디렉터리의 결과는 다음과 같습니다.

Xamarin.Mac.dll
Xamarin.Mac.pdb
consoleapp.exe
consoleapp.pdb
libxammac.dylib

이 앱을 실행하려면 동일한 디렉터리에 있는 모든 파일이 필요합니다.

배포를 위한 독립 실행형 애플리케이션 빌드

단일 실행 파일을 사용자에게 배포할 수 있습니다. 이렇게 하려면 도구를 사용하여 mkbundle 다양한 파일을 자체 포함 실행 파일로 전환할 수 있습니다.

먼저 애플리케이션이 컴파일되고 실행되는지 확인합니다. 결과에 만족하면 명령줄에서 다음 명령을 실행할 수 있습니다.

$ mkbundle --simple -o /tmp/consoleapp consoleapp.exe --library libxammac.dylib --config /Library/Frameworks/Mono.framework/Versions/Current/etc/mono/config --machine-config /Library/Frameworks/Mono.framework/Versions/Current/etc/mono/4.5/machine.config
[Output from the bundling tool]
$ _

위의 명령줄 호출에서 이 옵션은 -o 생성된 출력을 지정하는 데 사용됩니다. 이 경우 전달했습니다 /tmp/consoleapp. 이제 배포할 수 있는 독립 실행형 애플리케이션이며 Mono 또는 Xamarin.Mac에 대한 외부 종속성이 없으므로 완전히 자체 포함된 실행 파일입니다.

명령줄에서 사용할 machine.config 파일과 시스템 전체 라이브러리 매핑 구성 파일을 수동으로 지정했습니다. 모든 애플리케이션에 필요하지는 않지만 .NET의 더 많은 기능을 사용할 때 사용되므로 번들로 묶는 것이 편리합니다.

프로젝트 없는 빌드

자체 포함 Xamarin.Mac 애플리케이션을 만드는 데 전체 프로젝트가 필요하지 않으며 간단한 Unix 메이크파일을 사용하여 작업을 완료할 수도 있습니다. 다음 예제에서는 간단한 명령줄 애플리케이션에 대한 메이크파일을 설정하는 방법을 보여줍니다.

XAMMAC_PATH=/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/x86_64/full/
DYLD=/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib
MONODIR=/Library/Frameworks/Mono.framework/Versions/Current/etc/mono

all: consoleapp.exe

consoelapp.exe: consoleapp.cs Makefile
    mcs -g -r:$(XAMMAC_PATH)/Xamarin.Mac.dll consoleapp.cs
    
run: consoleapp.exe
    MONO_PATH=$(XAMMAC_PATH) DYLD_LIBRARY_PATH=$(DYLD) mono --debug consoleapp.exe $(COMMAND)

bundle: consoleapp.exe
    mkbundle --simple consoleapp.exe -o ncsharp -L $(XAMMAC_PATH) --library $(DYLD)/libxammac.dylib --config $(MONODIR)/config --machine-config $(MONODIR)/4.5/machine.config

위의 Makefile 세 가지 대상은 다음과 같습니다.

  • make 은 프로그램을 빌드합니다.
  • make run 는 현재 디렉터리에서 프로그램을 빌드하고 실행합니다.
  • make bundle 는 자체 포함된 실행 파일을 만듭니다.