​.NET Core 3.0’daki yenilikler

Bu makalede .NET Core 3.0'daki yeniler açıklanmıştır. En büyük iyileştirmelerden biri, masaüstü uygulamalarına Windows desteğidir (yalnızca Windows). Desktop'ta .NET Core 3.0 SDK Windows kullanarak, Windows Forms ve Windows Presentation Foundation (WPF) uygulamalarınızı taşınabilirsiniz. Net bir şekilde ifade etmek Windows Desktop bileşeni yalnızca Windows. Daha fazla bilgi için bu makalenin Windows masaüstü bölümüne bakın.

.NET Core 3.0, C# 8.0 desteği 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 bir sürümü ya da en son C# uzantısına sahip Visual Studio Code'yi kullanmanız kesinlikle önerilir.

.NET Core 3.0'ı şu anda Windows, macOS veya Linux'ta indirin ve çalışmaya başlama.

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

.NET Core 3.0 RC 1, Microsoft tarafından üretime hazır olarak kabul edildi ve tam olarak desteklandı. Bir önizleme sürümü kullanıyorsanız, destek devam etmek için RTM sürümüne geç gerekir.

C# 8.0 dil geliştirmeleri

C# 8.0 ayrıca null değere değiştirilebilir başvuru türleri özelliğini, zaman uyumsuz akışları ve daha fazla deseni içeren bu sürümün bir parçası. C# 8.0 özellikleri hakkında daha fazla bilgi için bkz. C# 8.0'daki yeni özellikler.

C# 8.0 dil özellikleriyle ilgili öğreticiler:

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

.NET Standard 2.1

.NET Core 3.0, .NET Standard 2.1'i uygulamaya almaktadır. Ancak, varsayılan dotnet new classlib şablon hala 2.0'.NET Standard bir proje oluşturur. 2.1.NET Standard i hedeflemek için proje dosyanızı düzenleyin ve TargetFramework özelliğini olarak netstandard2.1 değiştirme:

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

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

</Project>

Visual Studio kullanıyorsanız, Visual Studio 2017 Visual Studio 2.1veya .NET Core 3.0 .NET Standard desteklemez.

Derleme/Dağıtma

Varsayılan yürütülebilir dosyalar

.NET Core artık varsayılan olarak çerçeveye bağımlı yürütülebilir dosyalar derlemeye devam ediyor. Bu davranış, .NET Core'un genel olarak yüklenmiş bir sürümünü kullanan uygulamalar için yenidir. Daha önce, yalnızca kendi içinde dağıtımlar yürütülebilir bir dosya üretirdi.

veya sırasında, kullanmakta olan SDK'nın ortamı ve platformuyla eşleşen bir yürütülebilir dosya dotnet build dotnet publish (appHost olarak bilinir) oluşturulur. Aşağıdakiler gibi diğer yerel yürütülebilir dosyalarla aynı şeyleri bu yürütülebilir dosyalarla da çalıştırılabilir:

  • Yürütülebilir dosyaya çift tıklar.
  • Uygulamayı doğrudan bir komut isteminden (örneğin, Windows ve Linux ve myapp.exe ./myapp macOS'ta başlatabilirsiniz.

macOS appHost ve noterleştirme

Yalnızca macOS

macOS için noter .NET Core SDK 3.0'dan başlayarak, varsayılan yürütülebilir dosya oluşturma ayarı (appHost olarak bilinir) varsayılan olarak devre dışıdır. Daha fazla bilgi için bkz. macOS Catalina Noterization ve .NET Coreindirmeleri ve projeleri üzerindeki etkisi.

appHost ayarı etkinleştirildiğinde, derleme veya yayımlama için .NET Core yerel bir Mach-O yürütülebilir dosyası üretir. Uygulamanız, komutuyla kaynak koddan çalıştırılana veya Mach-O yürütülebilir dosyasını doğrudan başlatarak appHost dotnet run bağlamında çalışır.

appHost olmadan, kullanıcının çerçeveye bağımlı bir uygulamayı başlatmanın tek yolu komutuyladır. dotnet <filename.dll> AppHost, kendi içinde yayımlasanız her zaman oluşturulur.

appHost'u proje düzeyinde yapılandırabilirsiniz veya parametresiyle belirli bir komut için dotnet appHost'u açıp -p:UseAppHost aç/kaldırabilirsiniz:

  • Project dosyası

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

    dotnet run -p:UseAppHost=true
    

Ayar hakkında daha fazla UseAppHost bilgi için bkz. MSBuild.Sdk için Microsoft .NET özellikleri.

Tek dosyalı yürütülebilir dosyalar

komutu, dotnet publish uygulamalarınızı platforma özgü tek dosyalı yürütülebilir dosya olarak paketlemeyi destekler. Yürütülebilir dosya kendi kendine ayıklanır ve uygulama çalıştırmak için gereken tüm bağımlılıkları (yerel dahil) içerir. Uygulama ilk kez çalıştırıldı mı, uygulama, uygulama adına ve derleme tanımlayıcısına göre bir dizine ayıklanır. Uygulama yeniden çalıştırılana kadar başlatma işlemi daha hızlıdır. Yeni bir sürüm kullanılmadıkça uygulamanın kendisini ikinci kez ayıklaması gerek yoktur.

Tek dosyalı yürütülebilir dosyayı PublishSingleFile yayımlamak için projenizin içinde veya komut satırına komutuyla dotnet publish ayarlayın:

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

-veya-

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

Tek dosyalı yayımlama hakkında daha fazla bilgi için tek dosyalı paketleyici tasarım belgesine bakın.

Derleme kırpma

.NET Core 3.0 SDK'sı, IL'i analiz ederek ve kullanılmayan derlemeleri kırparak uygulamaların boyutunu azaltan bir araçla birlikte gelir.

Kendi içinde uygulamalar, ana bilgisayarda .NET'in yüklü olması gerekmeden kodunuzu çalıştırmak için gereken her şeyi içerir. Ancak, çoğu zaman uygulamanın çalışması için çerçevenin yalnızca küçük bir alt kümesi gerekir ve diğer kullanılmayan kitaplıklar kaldırılabilir.

.NET Core artık, uygulamanın IL'sini taramak için IL Düzeltici aracını kullanan bir ayar içerir. Bu araç hangi kodun gerekli olduğunu algılar ve ardından kullanılmayan kitaplıkları kırpıyor. Bu araç, bazı uygulamaların dağıtım boyutunu önemli ölçüde azaltabilir.

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

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

Örneğin, yayımlansa dahil edilen temel "merhaba dünya" yeni konsol proje şablonu yaklaşık 70 MB boyutuna gelir. kullanılarak <PublishTrimmed> bu boyut yaklaşık 30 MB'a düşürülerek.

Yansımayı veya ilgili dinamik özellikleri kullanan uygulamaların veya çerçevelerin (ASP.NET Core ve WPF dahil) genellikle kırpıldıklarda bozulamayacaklarını göz önünde bulundurabilirsiniz. Bu kesintinin nedeni, düzelticinin bu dinamik davranışı bilmiyor olması ve yansıma için hangi çerçeve türlerinin gerekli olduğunu belirleyelememasıdır. IL Düzeltici aracı, bu senaryoyu fark etmek için yalıtabilirsiniz.

Diğer her şeyden önce, kırpmadan sonra uygulamayı test edin.

IL Düzeltici aracı hakkında daha fazla bilgi için belgelere bakın veya mono/linker repos'larını ziyaret edin.

Katmanlı derleme

Katmanlı derleme (TC), .NET Core 3.0 ile varsayılan olarak açıktır. Bu özellik, çalışma zamanının daha iyi performans elde etmek için tam zamanında (JIT) derleyiciyi daha uyarlamalı bir şekilde kullanmalarına olanak sağlar.

Katmanlı derlemenin temel avantajı, iki farklı yöntem sunmaktır: daha düşük kaliteli ancak daha hızlı bir katmanda veya daha yüksek kaliteli ancak daha yavaş bir katmanda. Kalite, yöntemin ne kadar iyileştirilmiş olduğunu ifade eder. TC, başlangıçtan kararlı bir durumdan yürütmenin çeşitli aşamalarından geçen bir uygulamanın performansını artırmaya yardımcı olur. Katmanlı derleme devre dışı bırakılmıştır, her yöntem başlangıç performansı üzerinde kararlı durum performansına sapmadan tek bir şekilde derlenmiş olur.

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

  • yöntemi önceden derlenmiş koda veya ReadyToRun'asahipse, önceden derlenmiş kod kullanılır.
  • Aksi takdirde yöntem jitted olur. Genellikle, bu yöntemler değer türlerine göre genel türlerdir.
    • Hızlı JIT, daha hızlı bir şekilde daha düşük kaliteli (veya daha az iyileştirilmiş) kod üretir. .NET Core 3.0'da, hızlı JIT döngüler içeren yöntemler için varsayılan olarak etkinleştirilir ve başlatma sırasında tercih edilir.
    • Tam olarak iyileştirilmiş JIT, daha yüksek kaliteli (veya daha iyileştirilmiş) kodu daha yavaş üretir. Hızlı JIT'nin kullanılmay olduğu yöntemler için (örneğin, yöntemi ile öznitelikli MethodImplOptions.AggressiveOptimization ise), tam iyileştirme JIT kullanılır.

Sık çağrılır yöntemler için, tam zamanında derleyici sonunda arka planda tam olarak iyileştirilmiş kod oluşturur. İyileştirilmiş kod daha sonra bu yöntemin önceden derlenmiş kodunun yerini alar.

Hızlı JIT tarafından oluşturulan kod daha yavaş çalışır, daha fazla bellek ayırabilir veya daha fazla yığın alanı kullanabilir. Sorunlar varsa, proje dosyasındaki bu MSBuild Hızlı JIT'yi devre dışı sayabilirsiniz:

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

TC'yi tamamen devre dışı bırakmak MSBuild proje dosyanıza şu MSBuild özelliğini kullanın:

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

İpucu

Proje dosyasında bu ayarları değiştirirsanız, yeni ayarların yansıt olması için temiz bir derleme gerçekleştirmeniz gerekebilir (ve dizinlerini silin ve yeniden obj bin derleme).

Derlemeyi çalışma zamanında 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çimi olarak derlemek ile .NET Core uygulamanın başlangıç süresini geliştirebilirsiniz. R2R, zamanından önce (AOT) derlemenin bir 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 uygulama Windows kullanılabilir.

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

  1. Ayarı <PublishReadyToRun> 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 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 Windows, bu 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.
  • Küçük
    İ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.
  • Büyük
    İ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ırakmak
    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 (uygulama için belirtilen şekilde) bir yayın sürümü ise, yalnızca sürüm sürümleri ileri .runtimeconfig.json 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 DOTNET_ROLL_FORWARD_TO_PRERELEASE=1 değiştirilebilir ve 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 dotnet publish kopyalandı.

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 dotnet-tools.json bildirim 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ı küresel 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ı dahil olmak üzere 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, XAML adaları Fluent kullanıcı arabirimi XAML Kitaplığı'Windows (WinUI) modern denetimlerin ve stil stil oluşturmanın da kullanımına destek sağlar.

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

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

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ına .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 Application.SetHighDpiMode(HighDpiMode) ayarlabilirsiniz. yöntemi, ayar veya P/Invoke gibi başka yöntemler tarafından ayarlandıkça karşılık gelen yüksek SetHighDpiMode App.Manifest DPI modunu Application.Run ayarlar.

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 tarafından çağrılabilir yönetilen bileşenler 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şeni oluşturma ve kullanma örneği için bkz. COM Demo.

Windows Yerel Birlikte Çalışma

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

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 WindowsUygulama 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 SerialPort Windows.

Linux'ta seri bağlantı noktası için sınırlı destek hakkında daha fazla bilgi için bkz. GitHub 33146numaralı 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ı docker run -m çalıştırarak .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.3desteğ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, hem hem de türleri TLS 1.3 kullanır (hem istemci hem de sunucu System.Net.Security.SslStream System.Net.Http.HttpClient 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ı https://www.cloudflare.com açıklandı:

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 System.Security.Cryptography.AesGcm için destek System.Security.Cryptography.AesCcm ekler. Bu algoritmaların her ikisi de İlişki verisi (AEAD) ile Kimliği Doğrulanmış Şifreleme algoritmalarıdır.

Aşağıdaki kod, rastgele verileri AesGcm şifrelemek 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 ve ECDiffieHellman 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 System.Security.Cryptography.Pkcs.Pkcs8PrivateKeyInfo PFX/PKCS #12 dosyaları ile System.Security.Cryptography.Pkcs.Pkcs12Info denetlenebilirsiniz. PFX/PKCS #12 dosyaları ile işlemek için System.Security.Cryptography.Pkcs.Pkcs12Builder kullanılır.

.NET Core 3.0 API değişiklikleri

Aralıklar ve dizinler

Yeni System.Index tür dizin oluşturma için kullanılabilir. Başlangıçtan sayan bir tane veya sondan sayan bir ön ek int ^ 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 başlangıç, biri de bitiş için olmak üzere iki değerden oluşan bir tür vardır ve bir aralık ifadesi System.Range Index x..y (C#) ile yaz olabilir. Ardından, dilim üreten Range bir ile 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 IAsyncEnumerable<T> tüketmenizi 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 yield return çağıranlara zaman uyumsuz bir akış üretmek için kullanır. Bu düzen yield return (kullanarak), 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, zaman uyumsuz yineleyiciler de oluşturabilirsiniz, örneğin, hem hem de içinde döndüren await foreach IAsyncEnumerable/IAsyncEnumerator bir await yield yineleyici. Atılması gereken nesneler için, ve gibi çeşitli BCL türlerinin IAsyncDisposable uygulayan Stream Timer kullanabilirsiniz.

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 büyük/küçük harfe duyarlı olmayan bir denetim yaparak ve varsa yukarıdaki Infinity NaN isteğe bağlı bir + denetime izin vererek.

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

  • BitIncrement(Double) Ve BitDecrement(Double)
    ve nextUp nextDown 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, Math.BitIncrement(0.0) dönüş. double.Epsilon

  • MaxMagnitude(Double, Double) Ve MinMagnitude(Double, Double)
    ve maxNumMag 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 minNumMag olan değeri verir. Örneğin, Math.MaxMagnitude(2.0, -3.0) dönüş. -3.0

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

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

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

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

  • CopySign(Double, Double)
    copySignIEEE işlemine karşılık gelir, değerini döndürür, x ancak işaretiyle y birlikte döndürür.

.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 System.Text.Json daha 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 DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2UNENCRYPTEDSUPPORT uygulama bağlamında 1 etkinleştirerek etkinleştirebilirsiniz:

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

Sonraki adımlar