Menerbitkan aplikasi .NET untuk macOS

Menerbitkan aplikasi .NET untuk macOS memerlukan beberapa langkah tambahan dibandingkan dengan platform lain, karena persyaratan keamanan Apple.

Prasyarat

Sebelum menerbitkan aplikasi .NET untuk macOS, pastikan Anda memiliki hal berikut:

  • Akun Pengembang Apple: Diperlukan untuk penandatanganan kode dan notarisasi.
  • Xcode Command Line Tools: Menyediakan codesign, altool, dan utilitas lainnya.
  • .NET SDK: Pastikan Anda memiliki .NET SDK terbaru yang terinstal.

Membuat aplikasi Anda menggunakan .NET SDK

Gunakan salah satu metode yang dijelaskan dalam gambaran umum penerbitan aplikasi .NET untuk menghasilkan aplikasi. Anda dapat membuat aplikasi yang bergantung pada kerangka kerja atau mandiri.

Menandatangani dan memberi notarisasi aplikasi Anda

Gunakan dokumentasi pengembang Apple untuk menandatangani dan untuk menotarisasi biner asli aplikasi. .NET membuat apphost asli yang dapat dieksekusi sebagai titik masuk untuk aplikasi Anda. Apphost ini harus ditandatangani dan, jika aplikasi Anda menggunakan kemampuan khusus, apphost harus diberi hak yang sesuai.

Fasilitas untuk aplikasi yang tidak diterbitkan sebagai Native AOT

Untuk aplikasi yang tidak diterbitkan sebagai Native AOT, com.apple.security.cs.allow-jit diperlukan hak akses.

Hak akses untuk aplikasi yang diterbitkan sebagai AOT Asli

Untuk aplikasi yang diterbitkan sebagai Native AOT, tidak diperlukan pemberian hak.

Hak akses opsional untuk debugging dan diagnostik

Hak berikut memungkinkan kemampuan penelusuran kesalahan dan diagnostik tambahan:

  • com.apple.security.get-task-allow: Diperlukan untuk pengumpulan dump dengan createdump dan dotnet dump.
  • com.apple.security.cs.debugger: Diperlukan untuk melampirkan debugger ke proses.

Peringatan

Gagal menandatangani dan menotarisasi aplikasi Anda dapat mengakibatkan aplikasi Anda mengalami crash (gagal fungsi) saat melakukan operasi terbatas.

Biner universal

macOS mendukung biner universal: satu file Mach-O yang berisi kode mesin untuk lebih dari satu arsitektur CPU. macOS memilih bagian yang cocok dengan prosesor saat ini, sehingga satu file dapat berjalan secara native pada komputer Apple silicon (arm64) dan Intel (x64).

.NET tidak menghasilkan biner universal secara langsung. Sebagai gantinya, Anda memublikasikan aplikasi satu kali untuk setiap arsitektur dan menggabungkan dua file eksekusi native dengan alat Apple lipo. Dua mode penerbitan .NET menghasilkan executable asli mandiri yang dapat Anda gabungkan dengan cara ini:

Menerbitkan biner universal file tunggal

Terbitkan aplikasi sekali per arsitektur ke direktori terpisah:

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

Kemudian gabungkan dua executable dan tanda tangani ulang hasilnya:

mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp

Penerbitan mandiri dalam satu file menyematkan runtime, assembly terkelola, dan pustaka native ke dalam file eksekusinya sendiri, sehingga file hasil penggabungan tersebut merupakan aplikasi yang lengkap. Binary universal kurang lebih setara dengan jumlah dari dua input.

Salin semua file yang masih tersisa dari salah satu direktori keluaran per arsitektur (misalnya, appsettings.json atau file yang dikecualikan dari bundel) ke lokasi yang sama dengan file eksekusi yang telah digabungkan.

Menerbitkan biner universal AOT Asli

Langkah-langkahnya sama dengan untuk file tunggal, tetapi ganti properti file tunggal dengan 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

Native AOT menghasilkan output yang jauh lebih kecil daripada publikasi file tunggal, sehingga biner universal juga tetap berukuran kecil.

Native AOT juga menghasilkan bundel simbol debug MyApp.dSYM untuk setiap arsitektur. Untuk menyimpan simbol untuk kedua irisan, simpan direktori per arsitektur, atau gabungkan DWARF biner di dalam bundel dengan lipo.