macOS 用の .NET アプリケーションを発行するには、Apple のセキュリティ要件により、他のプラットフォームと比較して追加の手順がいくつか必要です。
[前提条件]
macOS 用の .NET アプリケーションを発行する前に、次のことを確認してください。
- Apple 開発者アカウント: コード署名と公証に必要です。
-
Xcode コマンド ライン ツール:
codesign、altool、およびその他のユーティリティを提供します。 - .NET SDK: 最新の .NET SDK がインストールされていることを確認します。
.NET SDK を使用してアプリを生成する
.NET アプリケーションの発行の概要で説明されているいずれかの方法を使用して、アプリケーションを生成します。 フレームワークに依存するアプリケーションまたは自己完結型アプリケーションを作成できます。
アプリに署名して公証する
Apple の開発者向けドキュメントを使用して、アプリのネイティブ バイナリに署名し、公証します。 .NET では、アプリのエントリ ポイントとしてネイティブ apphost 実行可能ファイルが作成されます。 この apphost は署名する必要があり、アプリで特別な機能を使用する場合は、適切な 権利を割り当てる必要があります。
アプリケーション ID
アプリケーション ID は、macOS がアクセスの決定とポリシーを特定のアプリに関連付けるために使用するコード署名識別子であり、(Info.plist マニフェストの CFBundleIdentifier フィールドで指定されます)。
シークレットまたはその他のキーチェーン項目のアクセス決定を保存するアプリは、dotnet MyApp.dll ランチャー (MyApp) ではなく、dotnet などの apphost 実行可能ファイルを使用して配布および起動する必要があります。 アプリ固有の状態は、一意で安定したコード署名識別子に関連付ける必要があります。
dotnetランチャーは、このシナリオではサポートされていません。
ソフトウェア管理ソリューションでは、お使いの apphost の署名 ID を使用して、dotnet ホストを使用する他の .NET ホスト アプリケーションとは別に、アプリ固有の起動ポリシーを適用できます。
apphost に一意の安定したコード署名識別子を指定し、Apple Developer チームの Developer 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: プロセスにデバッガーをアタッチするために必要です。
Warnung
アプリの署名と公証に失敗すると、制限された操作の実行中にアプリケーションがクラッシュする可能性があります。
ユニバーサル バイナリ
macOS は ユニバーサル バイナリをサポートしています。複数の CPU アーキテクチャ用のマシン コードを含む 1 つの Mach-O ファイルです。 macOS は現在のプロセッサに一致するスライスを選択するため、1 つのファイルは Apple シリコン (arm64) マシンと Intel (x64) マシンの両方でネイティブに実行されます。
.NETは、ユニバーサル バイナリを直接生成しません。 代わりに、アーキテクチャごとに 1 回アプリを発行し、2 つのネイティブ実行可能ファイルを Apple lipo ツールとマージします。 2 つの.NET発行モードにより、自己完結型のネイティブ実行可能ファイルが生成され、この方法でマージできます。
-
単一ファイル アプリ (
PublishSingleFile) -
ネイティブ AOT デプロイ (
PublishAot)
単一ファイルのユニバーサル バイナリを発行する
アーキテクチャごとにアプリを個別のディレクトリに 1 回発行します。
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
次に、2 つの実行可能ファイルをマージし、結果に再署名します。
mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp
自己完結型の単一ファイル発行では、ランタイム、マネージド アセンブリ、およびネイティブ ライブラリが実行可能ファイル自体に埋め込まれるため、マージされたファイルは完全なアプリになります。 ユニバーサル バイナリは、2 つの入力のほぼ合計です。
マージされた実行可能ファイルの横にあるアーキテクチャごとの出力ディレクトリ ( 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