macOS için .NET uygulamalarını yayımlama

MacOS için .NET uygulamalarını yayımlamak, Apple'ın güvenlik gereksinimleri nedeniyle diğer platformlara kıyasla birkaç ek adım gerektirir.

Önkoşullar

macOS için .NET uygulamanızı yayımlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:

  • Apple Geliştirici Hesabı: Kod imzalama ve noter tasdik için gereklidir.
  • Xcode Komut Satırı Araçları: , codesignve diğer yardımcı programları sağlaraltool.
  • .NET SDK: En son .NET SDK'sının yüklü olduğundan emin olun.

.NET SDK kullanarak uygulamanızı oluşturma

Uygulama oluşturmak için .NET uygulama yayımlamaya genel bakış bölümünde açıklanan yöntemlerden birini kullanın. Çerçeveye bağımlı veya bağımsız bir uygulama oluşturabilirsiniz.

Uygulamanızı imzalama ve noter tasdikli hale getirme.

Uygulama yerel ikili dosyalarını imzalamak ve noter olarak almak için Apple'ın geliştirici belgelerini kullanın. .NET, uygulamanızın giriş noktası olarak yerel bir apphost yürütülebilir dosyası oluşturur. Bu apphost imzalanmalıdır ve uygulamanız özel özellikler kullanıyorsa uygun yetkilendirmelere atanmalıdır.

Yerel AOT olarak yayımlanmayan uygulamalar için yetkilendirmeler

Yerel AOTcom.apple.security.cs.allow-jit olarak yayımlanmayan uygulamalar için yetkilendirme gereklidir.

Yerel AOT olarak yayımlanan uygulamalar için yetkilendirmeler

Yerel AOT olarak yayımlanan uygulamalar için yetkilendirme gerekmez.

Hata ayıklama ve tanılama için isteğe bağlı yetkilendirmeler

Aşağıdaki yetkilendirmeler ek hata ayıklama ve tanılama özelliklerini etkinleştirir:

  • com.apple.security.get-task-allow: createdump ve dotnet dump ile döküm toplama için gereklidir.
  • com.apple.security.cs.debugger: İşleme hata ayıklayıcı eklemek için gereklidir.

Uyarı

Uygulamanızın imzalanmaması ve noter tasdikinin yapılmaması, kısıtlı bir işlem yürütülürken uygulamanın kilitlenmesine neden olabilir.

Evrensel ikili dosyalar

macOS evrensel ikili dosyaları destekler: birden fazla CPU mimarisi için makine kodu içeren tek bir Mach-O dosyası. macOS geçerli işlemciyle eşleşen dilimi seçer, bu nedenle bir dosya hem Apple silikon (arm64) hem de Intel (x64) makinelerinde yerel olarak çalışır.

.NET evrensel ikili dosyaları doğrudan üretmez. Bunun yerine, uygulamanızı mimari başına bir kez yayımlar ve iki yerel yürütülebilir dosyayı Apple lipo aracıyla birleştirirsiniz. İki .NET yayımlama modu, bu şekilde birleştirebileceğiniz bağımsız bir yerel yürütülebilir dosya oluşturur:

Tek dosyalı evrensel ikili dosya yayımlama

Uygulamayı mimari başına bir kez ayrı dizinlerde yayımlayın:

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

Ardından iki yürütülebilir dosyayı birleştirin ve sonucu yeniden imzalayın:

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

Kendi içinde tek dosya yayımlama çalışma zamanını, yönetilen derlemeleri ve yerel kitaplıkları yürütülebilir dosyanın kendisine ekler, böylece birleştirilmiş dosya tam uygulamadır. Evrensel ikili, kabaca iki girişin toplamıdır.

Mimari başına çıkış dizinlerinden birinden kalan tüm dosyaları (örneğin, appsettings.json paketten hariç tutulan dosyalar) birleştirilmiş yürütülebilir dosyanın yanına kopyalayın.

Yerel AOT evrensel ikili dosyası yayımlama

Adımlar tek dosya ile aynıdır, ancak tek dosya özelliklerini ile PublishAotdeğiştirin:

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

Yerel AOT tek dosyalı yayımlamadan çok daha küçük bir çıkış üretir, bu nedenle evrensel ikili de küçük kalır.

Yerel AOT ayrıca mimari başına bir MyApp.dSYM hata ayıklama simgesi paketi de yayar. Her iki dilimin de simgelerini korumak için, mimari başına dizinleri koruyun veya paketlerin DWARF içindeki ikili dosyaları ile lipobirleştirin.