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.

Uygulama kimliği

Uygulama kimliği, macOS'un erişim kararlarını ve ilkelerini belirli bir uygulamayla ilişkilendirmek için kullandığı kod imzalama tanımlayıcısıdır (CFBundleIdentifier bildirimindeki Info.plist alanda belirtildiği gibi).

Gizli diziler veya diğer anahtarlık öğeleri için erişim kararlarını kaydeden uygulamalar, dotnet MyApp.dll gibi bir apphost yürütülebilir dosyası kullanılarak dağıtılmalı ve başlatılmalıdır; dotnet başlatıcısı (MyApp) değil. Uygulamaya özgü durum benzersiz, kararlı bir kod imzalama tanımlayıcısıyla ilişkilendirilmelidir. Başlatıcı dotnet bu senaryoda desteklenmiyor.

Yazılım yönetimi çözümleri, uygulamaya özgü başlatma ilkelerini, dotnet konağını kullanan diğer .NET barındırılan uygulamalardan ayrı olarak uygulamak için apphost'unuzun imzalama kimliğini kullanabilir.

Apphost için benzersiz, kararlı bir kod imzalama tanımlayıcısı verin ve Apple Geliştirici ekibinizden bir Developer ID Application certificate ile yayınları imzalayın. Tanımlayıcıyı ve ekibi güncelleştirmeler arasında tutarlı tutun. Bunlardan herhangi birini değiştirmek, kullanıcıların ve yöneticilerin onayları yenilemesini gerektirebilir.

Ayrıntılar için apple'ın tek başına araçlara yönelik meta veriler ve tek tek yürütülebilir dosyaları imzalama yönergelerine bakın.

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 ikililer

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 kendine yeten tek dosyalı yayımlamada çalışma zamanı, yönetilen derlemeler ve yerel kitaplıklar doğrudan yürütülebilir dosyanın içine gömülür; böylece birleştirilmiş dosya uygulamanın tamamını oluşturur. 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 için olanlarla aynıdır, ancak tek dosya özelliklerini PublishAot ile değ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 dosya olarak yayımlamaya kıyasla çok daha küçük bir çıktı üretir; bu nedenle evrensel ikili dosya da küçük kalır.

Yerel AOT ayrıca her mimari için bir MyApp.dSYM hata ayıklama sembol paketi de oluşturur. Her iki dilimin simgelerini korumak için, mimariye özgü dizinleri koruyun ya da paketlerin içindeki DWARF ikili dosyalarını lipo ile birleştirin.