MacOS용 .NET 애플리케이션을 게시하려면 Apple의 보안 요구 사항으로 인해 다른 플랫폼에 비해 몇 가지 추가 단계가 필요합니다.
필수 조건
macOS용 .NET 애플리케이션을 게시하기 전에 다음이 있는지 확인합니다.
- Apple 개발자 계정: 코드 서명 및 표기화에 필요합니다.
-
Xcode 명령줄 도구: 및 기타 유틸리티를 제공합니다
codesignaltool. - .NET SDK: 최신 .NET SDK가 설치되어 있는지 확인합니다.
.NET SDK를 사용하여 앱 생성
.NET 애플리케이션 게시 개요에 설명된 방법 중 하나를 사용하여 애플리케이션을 생성합니다. 프레임워크 종속 애플리케이션 또는 자체 포함 애플리케이션을 만들 수 있습니다.
앱 서명 및 표기
Apple의 개발자 설명서를 사용하여 앱 네이티브 이진 파일에 서명하고 표기합니다. .NET은 네이티브 apphost 실행 파일을 앱의 진입점으로 만듭니다. 이 apphost는 서명되어야 하며 앱에서 특수 기능을 사용하는 경우 적절한 자격이 할당되어야 합니다.
애플리케이션 ID
애플리케이션 ID는 macOS에서 액세스 결정 및 정책을 특정 앱과 연결하는 데 사용하는 코드 서명 식별자입니다(CFBundleIdentifier 매니페스트의 Info.plist 필드에 지정된 대로).
비밀에 대한 또는 기타 키체인 항목에 대한 액세스 결정을 저장하는 앱은 dotnet MyApp.dll와 같은 apphost 실행 파일을 사용하여 배포하고 시작해야 하며, dotnet 시작 관리자(MyApp)를 사용해서는 안 됩니다. 앱별 상태는 고유하고 안정적인 코드 서명 식별자와 연결되어야 합니다. 이 시나리오에서는 dotnet 런처가 지원되지 않습니다.
소프트웨어 관리 솔루션은 apphost의 서명 ID를 사용하여 dotnet 호스트를 사용하는 다른 .NET 호스팅 애플리케이션과 별도로 앱별 시작 정책을 적용할 수 있습니다.
Apphost에 고유하고 안정적인 코드 서명 식별자를 제공하고 Apple 개발자 팀의 개발자 ID 애플리케이션 인증서를 사용하여 릴리스에 서명하세요. 업데이트 간에 식별자와 팀을 일관되게 유지합니다. 둘 중 하나를 변경하려면 사용자와 관리자가 승인을 갱신해야 할 수 있습니다.
자세한 내용은 독립 실행형 도구용 메타데이터 및 개별 실행 파일 서명에 대한 Apple의 지침을 참조하세요.
네이티브 AOT로 게시되지 않은 앱에 대한 권한
네이티브 AOT로 게시되지 않은 앱에는 com.apple.security.cs.allow-jit 권한이 필요합니다.
네이티브 AOT로 게시된 앱의 권한
네이티브 AOT로 게시된 앱의 경우 자격이 필요하지 않습니다.
디버깅 및 진단에 대한 선택적 권한
다음 자격은 추가 디버깅 및 진단 기능을 사용하도록 설정합니다.
-
com.apple.security.get-task-allow: 덤프 수집을 위해createdump와dotnet dump가 필요합니다. -
com.apple.security.cs.debugger: 프로세스에 디버거를 연결하는 데 필요합니다.
경고
앱에 서명하고 표기하지 못하면 제한된 작업을 실행하는 동안 애플리케이션이 충돌할 수 있습니다.
유니버설 바이너리
macOS는 둘 이상의 CPU 아키텍처에 대한 컴퓨터 코드를 포함하는 단일 Mach-O 파일인 범용 이진 파일을 지원합니다. macOS는 현재 프로세서와 일치하는 조각을 선택하므로 Apple 실리콘(arm64) 및 Intel(x64) 컴퓨터 모두에서 기본적으로 하나의 파일이 실행됩니다.
.NET 유니버설 이진 파일을 직접 생성하지 않습니다. 대신 아키텍처당 앱을 한 번 게시하고 두 개의 네이티브 실행 파일을 Apple lipo 도구와 병합합니다. 두 .NET 게시 모드는 이러한 방식으로 병합할 수 있는 자체 포함 네이티브 실행 파일을 생성합니다.
-
단일 파일 앱 (
PublishSingleFile) -
네이티브 AOT 배포 (
PublishAot)
단일 파일 유니버설 바이너리 게시
아키텍처별로 앱을 별도의 디렉터리에 게시합니다.
dotnet publish -c Release -r osx-arm64 --self-contained true \
-p:PublishSingleFile=true -o out/osx-arm64
dotnet publish -c Release -r osx-x64 --self-contained true \
-p:PublishSingleFile=true -o out/osx-x64
그런 다음 두 실행 파일을 병합하고 결과를 다시 서명합니다.
mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp
자체 포함된 단일 파일 게시는 런타임, 관리되는 어셈블리 및 네이티브 라이브러리를 실행 파일 자체에 포함하므로 병합된 파일은 전체 앱입니다. 유니버설 바이너리는 대략 두 입력 파일의 합과 비슷합니다.
병합된 실행 파일 옆에 있는 아키텍처별 출력 디렉터리(예: appsettings.json 번들에서 제외된 파일) 중 하나에서 나머지 파일을 복사합니다.
네이티브 AOT 범용 이진 파일 게시
단계는 단일 파일의 경우와 동일하지만 단일 파일 속성을 다음으로 PublishAot바꿉다.
dotnet publish -c Release -r osx-arm64 -p:PublishAot=true -o out/osx-arm64
dotnet publish -c Release -r osx-x64 -p:PublishAot=true -o out/osx-x64
mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp
네이티브 AOT는 단일 파일 게시보다 훨씬 작은 출력을 생성하므로 유니버설 이진 파일도 작게 유지됩니다.
네이티브 AOT는 아키텍처당 MyApp.dSYM 디버그 심볼 번들을 또한 생성합니다. 두 아키텍처 슬라이스의 심볼을 모두 유지하려면 아키텍처별 디렉터리를 유지하거나 번들 내부의 DWARF 바이너리를 lipo와 병합합니다.
.NET