​.NET Core 3.0’daki yenilikler

Bu makalede .NET Core 3,0 ' deki yenilikler açıklanır. en büyük geliştirmelerden biri, Windows masaüstü uygulamaları için destek içerir (yalnızca Windows). masaüstü Windows .net Core 3,0 SDK bileşenini kullanarak Windows Forms ve Windows Presentation Foundation (WPF) uygulamalarınızın bağlantı noktası oluşturabilirsiniz. açık olması için Windows masaüstü bileşeni yalnızca Windows desteklenir ve dahil edilmiştir. daha fazla bilgi için bu makalenin devamındaki Windows masaüstü bölümüne bakın.

.NET Core 3,0, C# 8,0 için destek ekler. Visual Studio 2019 sürüm 16,3 veya daha yeni bir sürümü, Mac için Visual Studio 8,3 veya daha yeni ya da en son C# uzantısıylaVisual Studio Code kullanmanız önemle önerilir.

Windows, macos veya Linux 'ta şimdi .net Core 3,0 'yi indirip kullanmaya başlayın.

Yayın hakkında daha fazla bilgi için bkz. .NET Core 3,0 duyurusu.

.NET Core 3,0 RC 1, Microsoft tarafından önceden hazırlanmıştı ve tam olarak desteklenmektedir. Önizleme sürümü kullanıyorsanız, devam eden destek için RTM sürümüne geçmeniz gerekir.

Dil geliştirmeleri C# 8,0

C# 8,0, null olabilen başvuru türleri özelliği, zaman uyumsuz akışlar ve daha fazla desen içeren bu sürümün bir parçasıdır. C# 8,0 özellikleri hakkında daha fazla bilgi için bkz. c# 8,0 ' dekiyenilikler.

C# 8,0 Dil özellikleriyle ilgili öğreticiler:

Aşağıda ayrıntılı olarak açıklanan aşağıdaki API özelliklerini desteklemek için dil geliştirmeleri eklenmiştir:

.NET Standard 2,1

.NET Core 3,0 .NET Standard 2,1uygular. Ancak, varsayılan dotnet new classlib şablon hala dotnet new classlib' i hedefleyen bir proje oluşturur. .NET Standard 2,1' i hedeflemek için proje dosyanızı düzenleyin ve özelliği şu şekilde netstandard2.1 değiştirin :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

</Project>

Visual Studio kullanıyorsanız, Visual Studio 2017 .NET Standard 2,1 veya .net Core 3,0' i desteklemediğinden, Visual Studio 2019gerekir.

Derle/dağıt

Varsayılan yürütülebilir dosyalar

.NET Core artık çerçeveye bağlı yürütülebilir dosyaları varsayılan olarak oluşturur. Bu davranış, .NET Core 'un küresel olarak yüklenen bir sürümünü kullanan uygulamalar için yenidir. Daha önce yalnızca kendi kendine kapsanan dağıtımlar yürütülebilir bir dosya üretecektir.

Veya dotnet publish sırasında dotnet build , kullanmakta olduğunuz SDK ortamı ve platformuyla eşleşen bir çalıştırılabilir ( dotnet buildolarak bilinir) oluşturulur. Bu yürütülebilir dosyalarla aynı şeyleri, diğer yerel yürütülebilir dosyaları gibi bekleyebilir, örneğin:

  • Yürütülebilir dosyaya çift tıklayabilirsiniz.
  • uygulamayı, Windows ve ./myapp Linux ve macos gibi myapp.exe bir komut isteminden doğrudan başlatabilirsiniz.

macOS appHost ve notarlama

Yalnızca macOS

MacOS için .NET Core SDK 3,0 ' den başlayarak, varsayılan bir yürütülebilir dosya (appHost olarak bilinir) oluşturma ayarı varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz. MacOS Catalina Notarleştirme ve .NET Core indirmeleri ve projeleri üzerindeki etki.

AppHost ayarı etkinleştirildiğinde, .NET Core, oluşturduğunuzda veya yayımladığınızda yerel bir MAK-O çalıştırılabilir dosyası oluşturur. Uygulamanız, komutuyla kaynak koddan dotnet run çalıştırıldığında veya mak-O yürütülebilir dosyasını doğrudan başlatarak appHost bağlamında çalışır.

AppHost olmadan, bir kullanıcıya çerçeveye bağımlı bir uygulama başlatabilir tek yöntem komutunu kullanabilirsiniz. Uygulamanızı kendi içindeyayımladığınızda her zaman bir appHost oluşturulur.

AppHost 'yi proje düzeyinde yapılandırabilir veya parametresi ile -p:UseAppHost belirli dotnet bir komut için apphost ' ı kapatabilirsiniz:

  • Project dosyası

    <PropertyGroup>
      <UseAppHost>true</UseAppHost>
    </PropertyGroup>
    
  • Komut satırı parametresi

    dotnet run -p:UseAppHost=true
    

ayarı hakkında UseAppHost daha fazla bilgi için bkz. UseAppHost.

Tek dosya yürütülebilir dosyaları

Komut, dotnet publish uygulamanızı platforma özgü tek dosya yürütülebilir dosyasına paketlemeyi destekler. Yürütülebilir dosya kendiliğinden ayıklanıyor ve uygulamanızı çalıştırmak için gerekli tüm bağımlılıkları (yerel dahil) içerir. Uygulama ilk kez çalıştırıldığında uygulama adı ve derleme tanımlayıcısı temelinde bir dizine çıkarılır. Uygulama yeniden çalıştırıldığında başlatma daha hızlıdır. Yeni bir sürüm kullanılmadığı takdirde uygulamanın kendisi ikinci kez ayıklanmasına gerek yoktur.

Tek dosya yürütülebiliri yayımlamak için, projenizdeki öğesini veya komut satırında dotnet publish komutunu komutuyla ayarlayın PublishSingleFile :

<PropertyGroup>
  <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
  <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

-veya-

dotnet publish -r win10-x64 -p:PublishSingleFile=true

Tek dosya yayınlama hakkında daha fazla bilgi için bkz. tek dosya paketcisi tasarım belgesi.

Bütünleştirilmiş kod kırpma

.NET Core 3,0 SDK, Il 'yi çözümleyerek ve kullanılmayan derlemeleri kırparak uygulamaların boyutunu azaltan bir araçla birlikte gelir.

Bağımsız uygulamalar, kodunuzun çalıştırılması için gereken her şeyi, ana bilgisayara .NET yüklenmesini gerektirmeden içerir. Ancak, çoğu zaman uygulamanın çalışması için yalnızca küçük bir çerçeve alt kümesi gerekir ve kullanılmayan diğer kitaplıklar da kaldırılabilir.

.NET Core artık uygulamanızın Il 'sini taramak için Il kırpıcısı aracını kullanacak bir ayar içeriyor. Bu araç hangi kodun gerekli olduğunu algılar ve ardından kullanılmayan kitaplıkları kırpar. Bu araç bazı uygulamaların dağıtım boyutunu önemli ölçüde azaltabilir.

Bu aracı etkinleştirmek için projenize ayarı ekleyin <PublishTrimmed> ve kendi içinde bulunan bir uygulamayı yayımlayın:

<PropertyGroup>
  <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
dotnet publish -r <rid> -c Release

Örnek olarak, yayımlanan temel "Merhaba Dünya" yeni konsol projesi şablonu, yayımlandığında 70 MB ile çarpılır. Kullanarak <PublishTrimmed> , bu boyut yaklaşık 30 MB 'ye indirilir.

yansıma veya ilgili dinamik özellikleri kullanan uygulamaların veya çerçevelerin (ASP.NET Core ve WPF dahil) genellikle kırpıldığına göre kesilmesini göz önünde bulundurmanız önemlidir. Bu ayırıcı, ayarlayıcısı bu dinamik davranışı öğrenmediği ve yansıma için hangi çerçeve türlerinin gerekli olduğunu belirleyemediği için oluşur. Il ayarlayıcısı Aracı, bu senaryonun farkında olacak şekilde yapılandırılabilir.

Tüm diğerleri üzerinde, kırpdıktan sonra uygulamanızı test ettiğinizden emin olun.

Il ayarlayıcısı aracı hakkında daha fazla bilgi için belgelere bakın veya mono/bağlayıcı deposunu ziyaret edin.

Katmanlı derleme

Katmanlı derleme (TC), .net Core 3,0 ile varsayılan olarak açık olur. Bu özellik, çalışma zamanının daha iyi performans elde etmek için tam zamanında (JıT) derleyicisini daha kolay bir şekilde kullanmasına olanak sağlar.

Katmanlı derlemenin başlıca avantajı, daha düşük kalitede, ancak daha hızlı bir katmanda ya da daha yüksek kalitede, ancak daha yavaş bir katmanda çeşitli yöntemler elde etmenin iki yolunu sağlamaktır. Kalite, yöntemin en iyi duruma getirilmiş olduğunu gösterir. TC, düzenli bir durum aracılığıyla başlangıçtan itibaren çeşitli yürütme aşamalarından geçen bir uygulamanın performansını artırmaya yardımcı olur. Katmanlı derleme devre dışı bırakıldığında, her yöntem, başlangıç performansı üzerinden düzenli durum performansına yol gösteren tek bir şekilde derlenir.

TC etkinleştirildiğinde, bir uygulama başlatıldığında Yöntem derlemesi için aşağıdaki davranış geçerlidir:

  • Metodun önceden derlenen kodu veya Readytorunvarsa, önceden oluşturulan kod kullanılır.
  • Aksi halde, yöntemi jmesdir. Genellikle, bu yöntemler değer türleri üzerinde genel türlerdir.
    • Hızlı JIT daha hızlı (veya daha az iyileştirilmiş) kod üretir. .NET Core 3,0 ' de hızlı JıT, döngüler içermeyen ve başlangıç sırasında tercih edilen yöntemler için varsayılan olarak etkindir.
    • JıT 'i tamamen en iyi duruma getirmek daha yavaş daha yavaş (veya daha iyileştirilmiş) kod üretir. Hızlı JıT 'in kullanılacağı yöntemler için (örneğin, yöntemi ile MethodImplOptions.AggressiveOptimization ilişkilendirilebildiği), JIT tam olarak iyileştiriliyor kullanılır.

Sık çağrılan yöntemler için, tam zamanında derleyici arka planda tamamen iyileştirilmiş kod oluşturur. En iyi duruma getirilmiş kod daha sonra bu yöntem için önceden derlenmiş kodun yerini alır.

Hızlı JıT tarafından oluşturulan kod daha yavaş çalışabilir, daha fazla bellek ayırabilir veya daha fazla yığın alanı kullanabilir. sorunlar varsa, proje dosyasında bu MSBuild özelliğini kullanarak hızlı jıt 'i devre dışı bırakabilirsiniz:

<PropertyGroup>
  <TieredCompilationQuickJit>false</TieredCompilationQuickJit>
</PropertyGroup>

TC 'yi tamamen devre dışı bırakmak için, proje dosyanızda bu MSBuild özelliğini kullanın:

<PropertyGroup>
  <TieredCompilation>false</TieredCompilation>
</PropertyGroup>

İpucu

Bu ayarları proje dosyasında değiştirirseniz, yeni ayarların yansıtılması için temiz bir derleme gerçekleştirmeniz gerekebilir (ve bin dizinleri silin obj ve yeniden oluşturun).

Çalışma zamanında derlemeyi yapılandırma hakkında daha fazla bilgi için bkz. derleme Için çalışma zamanı yapılandırma seçenekleri.

ReadyToRun görüntüleri

Uygulama derlemelerinizi ReadyToRun (R2R) biçiminde derleyerek .NET Core uygulamanızın başlama süresini geliştirebilirsiniz. R2R, bir süre öncesi (AOT) derleme biçimidir.

R2R ikili dosyaları, uygulama yüklenirken tam zamanında (JIT) derleyicinin ihtiyacı olan iş miktarını azaltarak başlangıç performansını artırır. Ikili dosyalar, JIT'nin üretecekleri ile karşılaştırıldığında benzer yerel kod içerir. Ancak R2R ikili dosyaları, bazı senaryolar için hala gerekli olan ara dil (IL) kodunu ve aynı kodun yerel sürümünü içerdiği için daha büyüktür. R2R yalnızca Linux x64 veya x64 gibi belirli çalışma zamanı ortamlarını (RID) hedef alan kendi içinde bir Windows yayımlarsanız kullanılabilir.

Projenizi ReadyToRun olarak derlemek için şunları yapın:

  1. <PublishReadyToRun> Ayarı projenize ekleyin:

    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
  2. Kendi içinde bir uygulama yayımlama. Örneğin, bu komut, uygulamanın 64 bit sürümü için kendi içinde bir uygulama Windows:

    dotnet publish -c Release -r win-x64 --self-contained
    

Platformlar arası/mimari kısıtlamaları

ReadyToRun derleyicisi şu anda çapraz hedeflemeyi desteklemez. Verilen bir hedefte derlemeniz gerekir. Örneğin, x64 için R2R görüntülerini Windows ortamda yayımlama komutunu çalıştırmanız gerekir.

Çapraz hedefleme için özel durumlar:

  • Windows x64, ARM32, ARM64 ve x86 Windows derlemek için kullanılabilir.
  • Windows x86, ARM32 Windows derlemek için kullanılabilir.
  • Linux ARM32 ve ARM64 görüntülerini derlemek için Linux x64 kullanılabilir.

Daha fazla bilgi için bkz. Çalıştırmaya Hazır.

Çalışma zamanı/SDK

Ana sürüm çalışma zamanı ileri sarma

.NET Core 3.0, uygulamanın .NET Core'un en son ana sürümüne ilerlemesini sağlayan bir kabul etme özelliğine sahiptir. Buna ek olarak, uygulamanıza nasıl iletmenin uygulanıp uygulanmayacaklarını kontrol etmek için yeni bir ayar eklenmiştir. Bu, aşağıdaki yollarla yalıtabilirsiniz:

  • Project dosya özelliği:RollForward
  • Çalışma zamanı yapılandırma dosyası özelliği: rollForward
  • Ortam değişkeni: DOTNET_ROLL_FORWARD
  • Komut satırı bağımsız değişkeni: --roll-forward

Aşağıdaki değerlerden biri belirtilmelidir. Ayar atlanırsa, varsayılan küçük değerdir.

  • LatestPatch
    En yüksek düzeltme eki sürümüne iletin. Bu, ikincil sürüm ileri sarmayı devre dışı bırakıyor.
  • İkincil
    İstenen ikincil sürüm eksikse en düşük daha yüksek ikincil sürüme inin. İstenen ikincil sürüm varsa LatestPatch ilkesi kullanılır.
  • Ana
    İstenen ana sürüm eksikse en düşük yüksek ana sürüme ve en düşük ikincil sürüme inin. İstenen ana sürüm varsa, İkincil ilke kullanılır.
  • LatestMinor
    İstenen ikincil sürüm mevcut olsa bile en yüksek ikincil sürüme iletin. Bileşen barındırma senaryoları için tasarlanmıştır.
  • LatestMajor
    İstenen ana sürüm mevcut olsa bile en yüksek ana ve en yüksek ikincil sürüme inin. Bileşen barındırma senaryoları için tasarlanmıştır.
  • Devre Dışı Bırak
    Devam etme. Yalnızca belirtilen sürüme bağlayın. Bu ilke, en son düzeltme eklerini iletme özelliğini devre dışı bırakarak genel kullanım için önerilmez. Bu değer yalnızca test için önerilir.

Devre dışı bırak ayarının yanı sıra, tüm ayarlar en yüksek kullanılabilir düzeltme eki sürümünü kullanır.

Varsayılan olarak, istenen sürüm ( .runtimeconfig.json uygulama için belirtilen şekilde) bir yayın sürümü ise, yalnızca sürüm sürümleri ileri sarma için dikkate alınır. Tüm yayın öncesi sürümler yoksayılır. Eşleşen yayın sürümü yoksa yayın öncesi sürümler dikkate alınır. Bu davranış, ayarıyla değiştirilebilir DOTNET_ROLL_FORWARD_TO_PRERELEASE=1ve bu durumda tüm sürümler her zaman dikkate alınır.

Derleme kopya bağımlılıkları

Komutu dotnet build artık NuGet önbellekten derleme çıkış klasörüne NuGet bağımlılıkları kopyalar. Daha önce, bağımlılıklar yalnızca bir parçası olarak kopyalandı dotnet publish.

Kırpma ve Razor sayfa yayımlama gibi yayımlamayı gerektirecek bazı işlemler vardır.

Yerel araçlar

.NET Core 3.0 yerel araçları sunar. Yerel araçlar genel araçlara benzer, ancak diskte belirli bir konumla ilişkilendirilen araçlardır. Yerel araçlar küresel olarak kullanılamaz ve NuGet dağıtılır.

Yerel araçlar, geçerli dizinde bir bildirim dotnet-tools.json dosyası adı kullanılır. Bu bildirim dosyası, bu klasörde ve aşağıda kullanılabilir olacak araçları tanımlar. Kodunuzla çalışan herkesin aynı araçları geri yükleye ve kullanabileceğini sağlamak için bildirim dosyasını kodunuzla birlikte dağıtabilirsiniz.

Hem genel hem de yerel araçlar için çalışma zamanının uyumlu bir sürümü gerekir. Şu anda NuGet.org'da bulunan birçok araç .NET Core Runtime 2.1'i hedefler. Bu araçları genel veya yerel olarak yüklemek için NET Core 2.1 Çalışma Zamanı'nın yüklü olması gerekir.

Yeni global.json seçenekleri

global.json dosyasının hangi sürümünün kullan olduğunu tanımlamaya çalışırken daha fazla esneklik sağlayan yeni .NET Core SDK vardır. Yeni seçenekler şunlardır:

  • allowPrerelease: Sdk çözümleyicinin, kullanmak üzere SDK sürümünü seçerken ön sürüm sürümlerini göz önünde bulundurarak düşünmesi gerekip gerek olmadığını gösterir.
  • rollForward: Belirli bir SDK sürümü eksik olduğunda geri dönüş olarak veya daha yüksek bir sürümü kullanmak için bir yönerge olarak SDK sürümünü seçmede kullanmak üzere bir ileri sarma ilkesi gösterir.

Varsayılan değerler, desteklenen değerler ve yeni eşleştirme kuralları gibi değişiklikler hakkında daha fazla bilgi için bkz. global.json'a genel bakış.

Daha küçük Çöp Toplama yığın boyutları

Atık Toplayıcı'nın varsayılan yığın boyutu azaltıldı ve bu da daha az bellek kullanan .NET Core ile sonuçlandı. Bu değişiklik, modern işlemci önbelleği boyutlarıyla nesil 0 ayırma bütçesine daha uygundur.

Çöp Toplama Büyük Sayfa desteği

Büyük Sayfalar (Linux'ta Büyük Sayfalar olarak da bilinir), işletim sisteminin yerel sayfa boyutundan (genellikle 4K) daha büyük bellek bölgeleri kurarak bu büyük sayfaların istekte bulunduğu uygulamanın performansını artıran bir özelliktir.

Atık Toplayıcı artık GCLargePages ayarıyla, bir kabul özelliği olarak yalıtarak büyük sayfaları Windows.

Windows Desktop & COM

.NET Core SDK Windows Yükleyicisi

.NET Core 3.0 Windows için MSI yükleyicisi değişti. SDK yükleyicileri artık SDK özellik bant yayınlarını yerinde yükseltecek. Özellik bantları sürüm numarasının yama bölümündeki yüzlerce grupta tanımlanır. Örneğin, 3.0. 101 ve 3.0. 201 , iki farklı özellik bandının sürümleriyken 3.0'dır. 101 ve 3.0. 199 aynı özellik grubunda yer alıyor. 3.0 .NET Core SDK olduğunda da. 101 yüklü, .NET Core SDK 3.0. Varsa 100 makineden kaldırılır. 3.NET Core SDK 3.0 olduğunda. 200, 3.0'.NET Core SDK makineye yüklenir. 101 kaldırılamaz.

Sürüm hakkında daha fazla bilgi için bkz . .NET Core'un sürümüne genel bakış.

Windows masaüstü

.NET Core 3.0, Windows (WPF) ve Windows Presentation Foundation Forms kullanan Windows destekler. Bu çerçeveler ayrıca XAML adaları Fluent kullanıcı arabirimi XAML Kitaplığı'Windows (WinUI) modern denetimlerin ve stil oluşturma stillerini kullanmayı destekler.

Windows Desktop bileşeni, .NET Core 3.0 SDK Windows nın bir parçasıdır.

Aşağıdaki komutlarla yeni bir WPF veya Windows Forms uygulaması oluşturabilirsinizdotnet:

dotnet new wpf
dotnet new winforms

Visual Studio 2019, .NET Core 3.0 Project Forms ve WPF için yeni Windows şablonları ekler.

Mevcut bir uygulamanın nasıl bağlantı noktasıyla bağlantı .NET Framework için bkz. WPF projelerini ve Bağlantı noktası Windows Forms projelerini.

WinForms yüksek DPI

.NET Core Windows Forms uygulamaları ile yüksek DPI modu ayarlabilirsinizApplication.SetHighDpiMode(HighDpiMode). yöntemi SetHighDpiMode , ayar veya P/Invoke gibi başka App.Manifest yöntemler tarafından ayarlandıkça karşılık gelen yüksek DPI modunu ayarlar Application.Run.

Enum highDpiMode tarafından ifade edildik olası System.Windows.Forms.HighDpiMode değerler:

  • DpiUnaware
  • SystemAware
  • PerMonitor
  • PerMonitorV2
  • DpiUnawareGdiScaled

Yüksek DPI modları hakkında daha fazla bilgi için bkz. Yüksek DPI Masaüstü Uygulama Geliştirme Windows.

COM bileşenleri oluşturma

Bu Windows com çağrılabilir yönetilen bileşenleri oluşturabilirsiniz. Bu özellik, COM eklenti modelleriyle .NET Core'ın kullanımı ve aynı zamanda verilerle eşlik sağlamak için .NET Framework.

COM .NET Framework olarak mscoree.dll farklı olarak, COM bileşeninizi derlemek için .NET Core bin dizinine bir yerel başlatıcı dll ekler.

Com bileşenini oluşturma ve kullanma örneği için bkz. COM Demosu.

Windows Yerel Birlikte Çalışma

Windows düz C API'leri, COM ve WinRT şeklinde zengin bir yerel API sunar. .NET Core P/Invoke desteğine sahipken .NET Core 3.0, CoCreate COM API'leri ve Activate WinRT API'leri özelliğini ekler. Kod örneği için bkz. Excel Demo.

MSIX Dağıtımı

MSIX, yeni bir Windows paketi biçimidir. .NET Core 3.0 masaüstü uygulamalarını Windows 10.

Visual Studio 2019'da Windows Uygulama Paketleme Project, kendi içinde .NET Core uygulamalarıyla MSIX paketleri oluşturmanıza olanak sağlar.

.NET Core proje dosyasının özelliğinde desteklenen çalışma zamanlarını belirtmesi <RuntimeIdentifiers> gerekir:

<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>

Linux geliştirmeleri

Linux için SerialPort

.NET Core 3.0, Linux için temel System.IO.Ports.SerialPort destek sağlar.

Daha önce. .NET Core yalnızca WindowsSerialPort.

Linux'ta seri bağlantı noktası için sınırlı destek hakkında daha fazla bilgi için bkz. GitHub 33146 numaralı sorun.

Docker ve cgroup bellek Sınırları

Docker ile Linux üzerinde .NET Core 3.0'ı çalıştırma, cgroup bellek sınırlarıyla daha iyi çalışır. ile gibi bellek sınırlarına sahip bir Docker kapsayıcısı çalıştırarak docker run -m.NET Core'ın nasıl davranacağını değiştirir.

  • Varsayılan Atık Toplayıcı (GC) yığın boyutu: kapsayıcıda bellek sınırının en fazla %20 mb veya %75'i.
  • Açık boyut, mutlak bir sayı veya cgroup sınırının yüzdesi olarak ayarlanır.
  • GC yığını başına en düşük ayrılmış kesim boyutu 16 mb'tır. Bu boyut, makinelerde oluşturulan yığın sayısını azaltır.

Raspberry Pi için GPIO Desteği

GPIO programlaması için NuGet iki paket yayınlandı:

GPIO paketleri GPIO, SPI, I2C ve PWM cihazları için API'leri içerir. IoT bağlamaları paketi cihaz bağlamalarını içerir. Daha fazla bilgi için bkz. GitHub cihazlar.

ARM64 Linux desteği

.NET Core 3.0, Linux için ARM64 desteği ekler. ARM64 için birincil kullanım durumu şu anda IoT senaryolarındadır. Daha fazla bilgi için bkz . .NET Core ARM64 Durumu.

ARM64 üzerinde .NET Core için Docker görüntüleri Alpine, Debian ve Ubuntu için kullanılabilir.

Not

ARM64 Windows desteği henüz sağlanmadı.

Güvenlik

Linux üzerinde TLS 1.3 & OpenSSL 1.1.1

.NET Core artık openSSL 1.1.1'de TLS 1.3 desteğinin avantajını, verilen bir ortamda kullanılabilir olduğunda alır. TLS 1.3 ile:

  • İstemci ile sunucu arasında gereken gidiş dönüşlerin azaltılmasıyla bağlantı süreleri iyileştirildi.
  • Eski ve güvenli olmayan çeşitli şifreleme algoritmalarının kaldırılması nedeniyle güvenlik geliştirildi.

.NET Core 3.0 kullanılabilir olduğunda Linux sisteminde OpenSSL 1.1.1, OpenSSL 1.1.0 veya OpenSSL 1.0.2 kullanır. OpenSSL 1.1.1 kullanılabilir olduğunda, System.Net.Http.HttpClient hem hem de türleri System.Net.Http.HttpClient kullanır (hem istemci hem de sunucu TLS 1.3'ü destekler).

Önemli

Windows ve macOS henüz TLS 1.3'ü desteklemez.

Aşağıdaki C# 8.0 örneğinde ubuntu 18.10 üzerinde .NET Core 3.0'ın bağlantısı açıklandı https://www.cloudflare.com:

using System;
using System.Net.Security;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace whats_new
{
    public static class TLS
    {
        public static async Task ConnectCloudFlare()
        {
            var targetHost = "www.cloudflare.com";

            using TcpClient tcpClient = new TcpClient();

            await tcpClient.ConnectAsync(targetHost, 443);

            using SslStream sslStream = new SslStream(tcpClient.GetStream());

            await sslStream.AuthenticateAsClientAsync(targetHost);
            await Console.Out.WriteLineAsync($"Connected to {targetHost} with {sslStream.SslProtocol}");
        }
    }
}

Şifreleme şifrelemeleri

.NET Core 3.0, sırasıyla ve ile uygulanan AES-GCM ve AES-CCM şifrelemeleri için destek ekler. Bu algoritmaların her ikisi de İlişki verisi (AEAD) algoritmaları ile Kimliği Doğrulanmış Şifrelemedir.

Aşağıdaki kod, rastgele verileri şifrelemek AesGcm ve şifresini çözmek için şifreleme kullanmayı gösteriyor.

using System;
using System.Linq;
using System.Security.Cryptography;

namespace whats_new
{
    public static class Cipher
    {
        public static void Run()
        {
            // key should be: pre-known, derived, or transported via another channel, such as RSA encryption
            byte[] key = new byte[16];
            RandomNumberGenerator.Fill(key);

            byte[] nonce = new byte[12];
            RandomNumberGenerator.Fill(nonce);

            // normally this would be your data
            byte[] dataToEncrypt = new byte[1234];
            byte[] associatedData = new byte[333];
            RandomNumberGenerator.Fill(dataToEncrypt);
            RandomNumberGenerator.Fill(associatedData);

            // these will be filled during the encryption
            byte[] tag = new byte[16];
            byte[] ciphertext = new byte[dataToEncrypt.Length];

            using (AesGcm aesGcm = new AesGcm(key))
            {
                aesGcm.Encrypt(nonce, dataToEncrypt, ciphertext, tag, associatedData);
            }

            // tag, nonce, ciphertext, associatedData should be sent to the other part

            byte[] decryptedData = new byte[ciphertext.Length];

            using (AesGcm aesGcm = new AesGcm(key))
            {
                aesGcm.Decrypt(nonce, ciphertext, tag, decryptedData, associatedData);
            }

            // do something with the data
            // this should always print that data is the same
            Console.WriteLine($"AES-GCM: Decrypted data is {(dataToEncrypt.SequenceEqual(decryptedData) ? "the same as" : "different than")} original data.");
        }
    }
}

Şifreleme Anahtarı İçeri/Dışarı Aktarma

.NET Core 3.0, asimetrik ortak ve özel anahtarların standart biçimlerden içeri ve dışarı aktarmayı destekler. X.509 sertifikası kullanmana gerek yok.

RSA, DSA, ECDsa veECDiffieHellman gibi tüm anahtar türleri aşağıdaki biçimleri destekler:

  • Ortak Anahtar

    • X.509 SubjectPublicKeyInfo
  • Özel anahtar

    • PKCS#8 PrivateKeyInfo
    • PKCS#8 EncryptedPrivateKeyInfo

RSA anahtarları şunları da destekler:

  • Ortak Anahtar

    • PKCS#1 RSAPublicKey
  • Özel anahtar

    • PKCS#1 RSAPrivateKey

Dışarı aktarma yöntemleri DER ile kodlanmış ikili veriler üretir ve içeri aktarma yöntemleri de aynı şekilde bekler. Anahtar metin dostu PEM biçiminde depolanıyorsa, içeri aktarma yöntemini çağırmadan önce çağıranın içeriği base64 kodunu çözmesi gerekir.

using System;
using System.Security.Cryptography;

namespace whats_new
{
    public static class RSATest
    {
        public static void Run(string keyFile)
        {
            using var rsa = RSA.Create();

            byte[] keyBytes = System.IO.File.ReadAllBytes(keyFile);
            rsa.ImportRSAPrivateKey(keyBytes, out int bytesRead);

            Console.WriteLine($"Read {bytesRead} bytes, {keyBytes.Length - bytesRead} extra byte(s) in file.");
            RSAParameters rsaParameters = rsa.ExportParameters(true);
            Console.WriteLine(BitConverter.ToString(rsaParameters.D));
        }
    }
}

PKCS#8 dosyaları ile denetlenerek PFX/PKCS #12 dosyaları ile denetlenebilirsiniz . PFX/PKCS #12 dosyaları ile işlemek için kullanılır .

.NET Core 3.0 API değişiklikleri

Aralıklar ve dizinler

Yeni tür System.Index dizin oluşturma için kullanılabilir. Başlangıçtan sayan bir int tane veya ^ sondan sayan bir ön ek işleci (C#) ile bir tane oluşturabilirsiniz:

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

Ayrıca, biri System.Range başlangıç, Indexx..y biri de bitiş için olmak üzere iki değerden oluşan bir tür vardır ve bir aralık ifadesi (C#) ile yaz olabilir. Ardından, dilim üreten bir Rangeile dizine sahip olabilirsiniz:

var slice = a[i1..i2]; // { 3, 4, 5 }

Daha fazla bilgi için aralıklar ve dizinler öğreticisi'ne bakın.

Zaman uyumsuz akışlar

türü IAsyncEnumerable<T> , yeni bir zaman uyumsuz sürümüdür IEnumerable<T>. Bu dil, öğelerini await foreach tüketmenizi IAsyncEnumerable<T> ve öğelerini üretmek için yield return bunları kullanmalarını sağlar.

Aşağıdaki örnek, zaman uyumsuz akışların hem üretim hem de tüketimini gösteriyor. deyimi foreach zaman uyumsuzdur ve kendisini çağıranlara yield return zaman uyumsuz bir akış üretmek için kullanır. Bu düzen (kullanarak yield return), zaman uyumsuz akışlar üretmek için önerilen modeldir.

async IAsyncEnumerable<int> GetBigResultsAsync()
{
    await foreach (var result in GetResultsAsync())
    {
        if (result > 20) yield return result;
    }
}

mümkün olmanın yanı sıra await foreach, zaman uyumsuz yineleyiciler de oluşturabilirsiniz, örneğin, IAsyncEnumerable/IAsyncEnumerator hem hem de içinde döndüren bir await yineleyici yield . Atılması gereken nesneler için, ve gibi çeşitli IAsyncDisposableBCL türlerinin uygulayan kullanabilirsiniz StreamTimer.

Daha fazla bilgi için zaman uyumsuz akışlar öğreticisi'ne bakın.

IEEE Kayan nokta

Kayan nokta API'leri IEEE 754-2008 düzeltmesi ile uyumlu olacak şekilde güncelleştiriliyor. Bu değişikliklerin amacı tüm gerekli işlemleri ortaya çıkarmak ve bunların IEEE özellikleriyle davranışsal olarak uyumlu olduğundan emin olmaktır. Kayan nokta geliştirmeleri hakkında daha fazla bilgi için .NET Core 3.0'da Kayan Nokta Ayrıştırma ve Biçimlendirme geliştirmeleri blog gönderisini okuyun.

Ayrıştırma ve biçimlendirme düzeltmeleri şunları içerir:

  • Herhangi bir uzunluktaki girişleri doğru ayrıştır ve yuvarla.
  • Negatif sıfırı doğru ayrıştırın ve biçimlendirin.
  • Doğru ayrıştırın ve Infinity büyük NaN /küçük harfe duyarlı olmayan bir denetim yaparak ve varsa yukarıdaki isteğe bağlı bir denetime + izin vererek.

Yeni System.Math API'ler şunlardır:

  • BitIncrement(Double) ve BitDecrement(Double)
    nextUpnextDown ve IEEE işlemlerine karşılık gelen. Girişten daha büyük veya daha küçük olan (sırasıyla) karşılaştıran en küçük kayan nokta sayısını geri dönerler. Örneğin, dönüşMath.BitIncrement(0.0).double.Epsilon

  • MaxMagnitude(Double, Double) ve MinMagnitude(Double, Double)
    maxNumMagminNumMag ve IEEE işlemlerine karşılık gelen bu işlemler, iki girişin (sırasıyla) büyüklüğüne göre daha büyük veya daha küçük olan değeri verir. Örneğin, dönüşMath.MaxMagnitude(2.0, -3.0).-3.0

  • ILogB(Double)
    İntegral değer logB döndüren IEEE işlemine karşılık gelir, giriş parametresinin integral base-2 günlüğünü döndürür. Bu yöntem ile etkili bir şekilde aynıdır floor(log2(x)), ancak minimum yuvarlama hatasıyla yapılır.

  • ScaleB(Double, Int32)
    İntegral bir scaleB değer alan IEEE işlemine karşılık gelir, etkili bir şekilde döndürür x * pow(2, n), ancak minimum yuvarlama hatasıyla yapılır.

  • Log2(Double)
    log2 IEEE işlemine karşılık gelir, base-2 logathm döndürür. Yuvarlama hatasını en aza indirger.

  • FusedMultiplyAdd(Double, Double, Double)
    fma IEEE işleminin karşılık gelen çarpım ekleme işlemini gerçekleştirir. Başka bir ifadeyle, (x * y) + z tek bir işlem olarak yapar ve yuvarlama hatasını en aza indirer. Bunun bir örneği, FusedMultiplyAdd(1e308, 2.0, -1e308)döndüren örneğidir 1e308. Normal işlevi (1e308 * 2.0) - 1e308 döndürür double.PositiveInfinity.

  • CopySign(Double, Double)
    copySign IEEE işlemine karşılık gelir, değerini döndürürx, ancak işaretiyle birlikte döndürüry.

.NET Platform-Dependent Iç

SIMD veya Bit Düzenleme yönerge kümeleri gibi belirli performans odaklı CPU yönergelerine erişime olanak sağlayan API'ler eklendi. Bu yönergeler, verileri paralel olarak verimli bir şekilde işleme gibi belirli senaryolarda önemli performans geliştirmeleri elde edebilirim.

Uygun olduğunda, .NET kitaplıkları performansı artırmak için bu yönergeleri kullanmaya başlamıştır.

Daha fazla bilgi için bkz. .NET Platform-Dependent Iç Bilgileri.

Geliştirilmiş .NET Core Sürüm API'leri

.NET Core 3.0'dan başlayarak, .NET Core ile sağlanan sürüm API'leri artık beklediğiniz bilgileri geri döner. Örnek:

System.Console.WriteLine($"Environment.Version: {System.Environment.Version}");

// Old result
//   Environment.Version: 4.0.30319.42000
//
// New result
//   Environment.Version: 3.0.0
System.Console.WriteLine($"RuntimeInformation.FrameworkDescription: {System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription}");

// Old result
//   RuntimeInformation.FrameworkDescription: .NET Core 4.6.27415.71
//
// New result (notice the value includes any preview release information)
//   RuntimeInformation.FrameworkDescription: .NET Core 3.0.0-preview4-27615-11

Uyarı

Yeni değişiklik. Sürüm oluşturma şeması değişerek teknik olarak bu yeni bir değişikliktir.

Hızlı yerleşik JSON desteği

.NET kullanıcıları büyük ölçüde, iyi seçenekler olmaya devam eden Newtonsoft.Json ve diğer popüler JSON kitaplıklarına güvendi. Newtonsoft.Json temel veri türü olarak .NET dizelerini kullanır ve bu da başlık altında UTF-16'dır.

Yeni yerleşik JSON desteği yüksek performanslı, düşük ayırmadır ve UTF-8 ile kodlanmış JSON metniyle çalışır. Ad alanı ve türleri hakkında daha System.Text.Json fazla bilgi için aşağıdaki makalelere bakın:

HTTP/2 desteği

Tür System.Net.Http.HttpClient , HTTP/2 protokolünü destekler. HTTP/2 etkinse, HTTP protokolü sürümü TLS/ÜNÜN üzerinden anlaşılacaktır ve sunucu kullanmayı seçerse HTTP/2 kullanılır.

Varsayılan protokol HTTP/1.1 olarak kalır, ancak HTTP/2 iki farklı şekilde etkinleştirilebilir. İlk olarak, HTTP istek iletiyi HTTP/2 kullanmak üzere ayarlayın:

var client = new HttpClient() { BaseAddress = new Uri("https://localhost:5001") };

// HTTP/1.1 request
using (var response = await client.GetAsync("/"))
    Console.WriteLine(response.Content);

// HTTP/2 request
using (var request = new HttpRequestMessage(HttpMethod.Get, "/") { Version = new Version(2, 0) })
using (var response = await client.SendAsync(request))
    Console.WriteLine(response.Content);

İkincisi, varsayılan olarak HttpClient HTTP/2 kullanmak üzere değiştirebilirsiniz:

var client = new HttpClient()
{
    BaseAddress = new Uri("https://localhost:5001"),
    DefaultRequestVersion = new Version(2, 0)
};

// HTTP/2 is default
using (var response = await client.GetAsync("/"))
    Console.WriteLine(response.Content);

Çoğu zaman bir uygulama geliştirerek şifrelenmemiş bir bağlantı kullanmak istersiniz. Hedef uç noktanın HTTP/2 kullan olacağını biliyorsanız HTTP/2 için şifrelenmemiş bağlantıları açabilirsiniz. Ortam değişkenlerini olarak veya uygulama DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2UNENCRYPTEDSUPPORT bağlamında 1 etkinleştirerek etkinleştirebilirsiniz:

AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

Sonraki adımlar