​.NET Core 3.0’daki yenilikler

Bu makalede .NET Core 3.0'daki yenilikler açıklanmaktadır. En büyük geliştirmelerden biri Windows masaüstü uygulamaları için destektir (yalnızca Windows). .NET Core 3.0 SDK bileşeni Windows Masaüstü'nü kullanarak Windows Forms ve Windows Presentation Foundation (WPF) uygulamalarınızı taşıyabilirsiniz. Açık olmak gerekirse, Windows Masaüstü bileşeni yalnızca Windows'a desteklenir ve eklenir. Daha fazla bilgi için bu makalenin devamında yer alan 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, Mac için Visual Studio 8.3 veya daha yeni bir sürümü ya da en son C# uzantısıyla Visual Studio Code kullanmanız kesinlikle önerilir.

Windows, macOS veya Linux'ta .NET Core 3.0'ı indirin ve kullanmaya başlayın.

Sürüm 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 desteklendi. Ö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 atanabilir 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'daki yenilikler.

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 eklendi:

.NET Standard 2.1

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

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

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

</Project>

Visual Studio kullanıyorsanız Visual Studio 2019 gerekir çünkü Visual Studio 2017 .NET Standard 2.1 veya .NET Core 3.0'ı 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 derlemektedir. Bu davranış, .NET Core'un genel olarak yüklenmiş bir sürümünü kullanan uygulamalar için yenidir. Daha önce, yalnızca bağımsız dağıtımlar yürütülebilir dosya üretebilirdi.

veya dotnet publishsırasındadotnet build, kullandığınız SDK'nın ortamı ve platformuyla eşleşen bir yürütülebilir dosya (appHost olarak bilinir) oluşturulur. Aşağıdaki gibi diğer yerel yürütülebilir dosyalarla aynı şeyleri bu yürütülebilir dosyalarla da bekleyebilirsiniz:

  • Yürütülebilir dosyaya çift tıklayabilirsiniz.
  • Uygulamayı windows ve Linux ile ./myapp macOS gibi myapp.exe doğrudan bir komut isteminden başlatabilirsiniz.

macOS appHost ve noter tasdiki

yalnızca macOS

macOS için noter onaylı .NET Core SDK 3.0'dan başlayarak, varsayılan yürütülebilir dosya üretme ayarı (appHost olarak bilinir) varsayılan olarak devre dışı bırakılır. Daha fazla bilgi için bkz . macOS Catalina Notarization ve .NET Core indirmeleri ve projeleri üzerindeki etkisi.

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

appHost olmadan, kullanıcının çerçeveye bağımlı bir uygulama başlatmasının tek yolu komutudurdotnet <filename.dll>. Uygulamanızı bağımsız olarak yayımladığınızda her zaman bir appHost oluşturulur.

appHost'ı proje düzeyinde yapılandırabilir veya appHost'a belirli dotnet bir komut için parametresiyle -p:UseAppHost geçiş yapabilirsiniz:

  • Proje 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 . Microsoft.NET.Sdk için MSBuild özellikleri.

Tek dosyalı yürütülebilir dosyalar

komutu dotnet publish , uygulamanızı platforma özgü tek dosyalı yürütülebilir dosyaya paketlemeyi destekler. Yürütülebilir dosya kendi kendine ayıklanır ve uygulamanızı çalıştırmak için gereken 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 ayıklanır. Uygulama yeniden çalıştırıldığında başlangıç daha hızlı olur. Yeni bir sürüm kullanılmadığı sürece uygulamanın kendisini ikinci kez ayıklaması gerekmez.

Tek dosyalı yürütülebilir dosya yayımlamak için projenizde veya komut satırında komutunu şu dotnet publish komutla ayarlayınPublishSingleFile:

<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.

Montaj kırpma

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

Bağımsız uygulamalar, ana bilgisayarda .NET'in yüklenmesine gerek kalmadan 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ümesinin çalışması gerekir ve diğer kullanılmayan kitaplıklar kaldırılabilir.

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

Bu aracı etkinleştirmek için, ayarı projenize ekleyin <PublishTrimmed> ve bağımsız bir uygulama yayımlayın:

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

Örneğin, yayımlandığında eklenen temel "merhaba dünya" yeni konsol projesi şablonu yaklaşık 70 MB boyutundadır. kullanılarak <PublishTrimmed>bu boyut yaklaşık 30 MB'a düşürülmüştür.

Yansıma veya ilgili dinamik özellikleri kullanan uygulamaların veya çerçevelerin (ASP.NET Core ve WPF dahil) kırpıldığında genellikle bozulacağını göz önünde bulundurmak önemlidir. Bu kesinti, düzelticinin bu dinamik davranışı bilmediği ve yansıma için hangi çerçeve türlerinin gerekli olduğunu belirleyemediğinden oluşur. IL Düzeltici aracı bu senaryonun farkında olacak şekilde yapılandırılabilir.

Her şeyden önce, kırpmadan sonra uygulamanızı test etmeye özen gösterin.

IL Düzeltici aracı hakkında daha fazla bilgi için belgelere bakın veya mono/bağlayıcı depoyu 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) derleyicisini daha uyarlamalı bir şekilde kullanmasını sağlar.

Katmanlı derlemenin temel avantajı, iki tür jitting yöntemi sağlamaktır: daha düşük kaliteli ama daha hızlı bir katmanda veya daha yüksek kalitede ama daha yavaş bir katmanda. Kalite, yöntemin ne kadar iyi iyileştirildiğinden ifade eder. TC, başlatmadan kararlı duruma kadar çeşitli yürütme aşamalarından geçerken uygulamanın performansını iyileştirmeye yardımcı olur. Katmanlı derleme devre dışı bırakıldığında, her yöntem başlangıç performansına göre kararlı durum performansına sapmalı tek bir şekilde derlenmiş olur.

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

  • Yöntemin önceden derlenmiş kodu veya ReadyToRun'ı varsa, önceden oluşturulmuş kod kullanılır.
  • Aksi takdirde yöntemi jitted. Bu yöntemler genellikle değer türlerine göre genel değerlerdir.
    • 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ü içermeyen yöntemler için varsayılan olarak etkindir ve başlatma sırasında tercih edilir.
    • Tam olarak iyileştirilen JIT daha yüksek kaliteli (veya daha iyileştirilmiş) kodu daha yavaş üretir. Hızlı JIT'nin kullanılmadığı yöntemler için (örneğin, yöntemi ile MethodImplOptions.AggressiveOptimizationilişkilendirildiyse), tam iyileştirme JIT kullanılır.

Sık çağrılan 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öntem için önceden derlenmiş kodun yerini alır.

Hızlı JIT tarafından oluşturulan kod daha yavaş çalışabilir, daha fazla bellek ayırabilir veya daha fazla yığın alanı kullanabilir. Sorun varsa, proje dosyasındaki bu MSBuild özelliğini kullanarak Hızlı JIT'yi devre dışı bırakabilirsiniz:

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

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

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

İpucu

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

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çiminde derleyerek .NET Core uygulamanızın başlangıç süresini geliştirebilirsiniz. R2R, önceden (AOT) derlemenin bir biçimidir.

R2R ikili dosyaları, uygulamanız yüklenirken tam zamanında (JIT) derleyicinin yapması gereken iş miktarını azaltarak başlangıç performansını artırır. İkili dosyalar, JIT'nin üreteceği kodla 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ğinden daha büyüktür. R2R yalnızca Linux x64 veya Windows x64 gibi belirli çalışma zamanı ortamlarını (RID) hedefleyen bağımsız bir uygulama yayımladığınızda kullanılabilir.

Projenizi ReadyToRun olarak derlemek için aşağıdakileri yapın:

  1. <PublishReadyToRun> Ayarı projenize ekleyin:

    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
  2. Bağımsız bir uygulama yayımlama. Örneğin, bu komut Windows'un 64 bit sürümü için bağımsız bir uygulama oluşturur:

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

Platformlar arası/mimari kısıtlamaları

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

Çapraz hedefleme için özel durumlar:

  • Windows x64, Windows Arm32, Arm64 ve x86 görüntülerini derlemek için kullanılabilir.
  • Windows x86, Windows Arm32 görüntülerini derlemek için kullanılabilir.
  • Linux x64, Linux Arm32 ve Arm64 görüntülerini derlemek için 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ızın .NET Core'un en son ana sürümüne ilerlemesini sağlayan bir kabul etme özelliği sağlar. Ayrıca, ileri sarmanın uygulamanıza nasıl uygulanacağını denetlemek için yeni bir ayar eklendi. Bu, aşağıdaki yollarla yapılandırılabilir:

  • Proje dosyası ö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, İkincil varsayılan değerdir.

  • En Son Düzeltme Eki
    En yüksek yama sürümüne ilerleyin. Bu, ikincil sürümü ileri sarmayı devre dışı bırakır.
  • Küçük
    İstenen ikincil sürüm eksikse en düşük daha yüksek ikincil sürüme ilerleyin. İ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 ilerleyin. İstenen ana sürüm mevcutsa İkincil ilke kullanılır.
  • LatestMinor
    İstenen ikincil sürüm mevcut olsa bile en yüksek ikincil sürüme geçin. Bileşen barındırma senaryolarına yöneliktir.
  • LatestMajor
    İstenen ana dal mevcut olsa bile en yüksek ana ve en yüksek ikincil sürüme ilerleyin. Bileşen barındırma senaryolarına yöneliktir.
  • Devre Dışı Bırak
    İleri gitme. Yalnızca belirtilen sürüme bağlayın. Bu ilke, en son düzeltme eklerine ileri gitme özelliğini devre dışı bırakacağından 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 kullanılabilir en yüksek düzeltme eki sürümünü kullanır.

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

Kopya bağımlılıkları oluşturma

Komut dotnet build artık uygulamanız için NuGet bağımlılıklarını NuGet önbelleğinden derleme çıktı klasörüne kopyalar. Daha önce bağımlılıklar yalnızca öğesinin dotnet publishbir parçası olarak kopyalandı.

Kırpma ve razor sayfası yayımlama gibi yine de yayımlama gerektiren bazı işlemler vardır.

Yerel araçlar

.NET Core 3.0, yerel araçları tanıtır. Yerel araçlar genel araçlara benzer, ancak disk üzerindeki belirli bir konumla ilişkilendirilir. Yerel araçlar genel olarak kullanılamaz ve NuGet paketleri olarak dağıtılır.

Yerel araçlar, geçerli dizininizdeki bir bildirim dosyası adını dotnet-tools.json kullanır. Bu bildirim dosyası, söz konusu klasörde ve aşağıda kullanılabilir olacak araçları tanımlar. Kodunuzla çalışan herkesin aynı araçları geri yükleyebilmesini ve kullanabilmesini sağlamak için bildirim dosyasını kodunuzla dağıtabilirsiniz.

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

Yeni global.json seçenekleri

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

  • allowPrerelease: Kullanılacak SDK sürümünü seçerken SDK çözümleyicisinin yayın öncesi sürümleri göz önünde bulundurması gerekip gerekmediğini gösterir.
  • rollForward: Belirli bir SDK sürümü eksik olduğunda geri dönüş olarak veya daha yüksek bir sürümü kullanma yönergesi olarak BIR SDK sürümü seçerken kullanılacak ileri sarma ilkesini 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 genel bakış.

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

Çöp Toplayıcı'nın varsayılan yığın boyutu küçültüldü ve .NET Core'un daha az bellek kullanmasına neden oldu. Bu değişiklik, 0. nesil ayırma bütçesiyle modern işlemci önbellek boyutlarıyla daha iyi uyum sağlar.

Atık Toplama Büyük Sayfa desteği

Büyük Sayfalar (Linux'ta Büyük Sayfalar olarak da bilinir), işletim sisteminin bu büyük sayfaları isteyen uygulamanın performansını artırmak için yerel sayfa boyutundan (genellikle 4K) daha büyük bellek bölgeleri oluşturabildiği bir özelliktir.

Çöp Toplayıcı artık GcLargePages ayarıyla, Windows'da büyük sayfalar ayırmayı seçmeye yönelik bir kabul etme özelliği olarak yapılandırılabilir.

Windows Masaüstü ve COM

.NET Core SDK Windows Installer

Windows için MSI yükleyicisi .NET Core 3.0'dan başlayarak değişti. SDK yükleyicileri artık SDK özellik bandı sürümlerini yerinde yükseltecektir. Özellik bantları, sürüm numarasının düzeltme eki bölümündeki yüzlerce grupta tanımlanır. Örneğin, 3.0.101 ve 3.0.201 , 3.0 iken iki farklı özellik bandında bulunan sürümlerdir.101 ve 3.0.199 aynı özellik bandındadır. Ve .NET Core SDK 3.0 olduğunda.101 yüklü, .NET Core SDK 3.0.Varsa makineden 100 kaldırılır. .NET Core SDK 3.0 olduğunda.200 , .NET Core SDK 3.0 ile aynı makineye yüklenir.101 kaldırılmaz.

Sürüm oluşturma 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 Presentation Foundation (WPF) ve Windows Forms kullanan Windows masaüstü uygulamalarını destekler. Bu çerçeveler, XAML adaları aracılığıyla Windows UI XAML Kitaplığı'ndan (WinUI) modern denetimleri ve Fluent stillerini kullanmayı da destekler.

Windows Masaüstü bileşeni, Windows .NET Core 3.0 SDK'sının bir parçasıdır.

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

dotnet new wpf
dotnet new winforms

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

Mevcut bir .NET Framework uygulamasını taşıma hakkında daha fazla bilgi için bkz . WPF projelerini ve Bağlantı Noktası Windows Forms projelerini taşıma.

WinForms yüksek DPI

.NET Core Windows Forms uygulamaları ile Application.SetHighDpiMode(HighDpiMode)yüksek DPI modunu ayarlayabilir. yöntemi, SetHighDpiMode ayarı veya daha önce Application.RunP/Invoke gibi App.Manifest başka yollarla ayarlanmadığı sürece ilgili yüksek DPI modunu ayarlar.

Sabit listesi tarafından System.Windows.Forms.HighDpiMode ifade edilen olası highDpiMode değerler şunlardır:

  • DpiUnaware
  • SystemAware
  • PerMonitor
  • PerMonitorV2
  • DpiUnawareGdiScaled

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

COM bileşenleri oluşturma

Windows'da artık COM çağrılabilen yönetilen bileşenler oluşturabilirsiniz. Bu özellik, .NET Core'un COM eklenti modelleriyle kullanılması ve .NET Framework ile eşlik sağlanması açısından kritik öneme sahiptir.

COM sunucusu olarak mscoree.dll kullanıldığı .NET Framework'ün aksine, COM bileşeninizi oluştururken .NET Core bin dizinine yerel bir başlatıcı dll ekler.

BIR COM bileşeni oluşturma ve bileşeni kullanma örneği için bkz . COM Tanıtımı.

Windows Yerel Birlikte Çalışma

Windows düz C API'leri, COM ve WinRT biçiminde zengin bir yerel API sunar. .NET Core P/Invoke'u desteklese de.NET Core 3.0, COM API'leriniBirlikte Oluşturma ve WinRT API'lerini Etkinleştirme özelliğini ekler. Kod örneği için bkz . Excel Tanıtımı.

MSIX Dağıtımı

MSIX , yeni bir Windows uygulama paketi biçimidir. .NET Core 3.0 masaüstü uygulamalarını Windows 10'a dağıtmak için kullanılabilir.

Visual Studio 2019'da bulunan Windows Uygulama Paketleme Projesi, bağımsız .NET Core uygulamalarıyla MSIX paketleri oluşturmanıza olanak tanır.

.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 üzerinde için System.IO.Ports.SerialPort temel destek sağlar.

Daha önce .NET Core yalnızca Windows'da kullanılarak SerialPort destekleniyor.

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

Docker ve cgroup bellek sınırları

Docker ile Linux üzerinde .NET Core 3.0 çalıştırmak, cgroup bellek sınırlarıyla daha iyi çalışır. ile docker run -mgibi bellek sınırlarına sahip bir Docker kapsayıcısı çalıştırmak, .NET Core'un davranış biçimini değiştirir.

  • Varsayılan Çöp Toplayıcı (GC) yığın boyutu: kapsayıcıdaki 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 ayarlanabilir.
  • GC yığını başına en düşük ayrılmış segment 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 kullanabileceğiniz iki paket NuGet'e yayımlandı:

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 . Cihazlar GitHub deposu.

Arm64 Linux desteği

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

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

Not

macOS Arm64 (veya "Apple Silicon") ve Windows Arm64 işletim sistemleri desteği daha sonra .NET 6'ya eklendi.

Güvenlik

Linux üzerinde TLS 1.3 ve OpenSSL 1.1.1

.NET Core artık belirli bir ortamda kullanılabilir olduğunda OpenSSL 1.1.1'deki TLS 1.3 desteğinden yararlanıyor. TLS 1.3 ile:

  • Bağlan süresi, istemci ve sunucu arasında gereken gidiş dönüşlerin azaltılmasıyla iyileştirilir.
  • Çeşitli eski ve güvenli olmayan şifreleme algoritmalarının kaldırılması nedeniyle geliştirilmiş güvenlik.

Kullanılabilir olduğunda, .NET Core 3.0 bir 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 System.Net.Http.HttpClient hem de System.Net.Security.SslStream türleri TLS 1.3 kullanır (hem istemci hem de sunucu TLS 1.3'i desteklediği varsayılır).

Aşağıdaki C# 8.0 örneği, Ubuntu 18.10 üzerinde .NET Core 3.0'ın öğesine bağlanmasını https://www.cloudflare.comgösterir:

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

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

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, standart biçimlerden asimetrik genel ve özel anahtarların içeri ve dışarı aktarılmasını destekler. X.509 sertifikası kullanmanız gerekmez.

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, arayanın içeri aktarma yöntemini çağırmadan önce içeriğin 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 System.Security.Cryptography.Pkcs.Pkcs8PrivateKeyInfo denetlenebilir ve PFX/PKCS#12 dosyaları ile System.Security.Cryptography.Pkcs.Pkcs12Infodenetlenebilir. PFX/PKCS#12 dosyaları ile System.Security.Cryptography.Pkcs.Pkcs12Builderişlenebilir.

.NET Core 3.0 API değişiklikleri

Aralıklar ve dizinler

Yeni System.Index tür dizin oluşturmak için kullanılabilir. Baştan sayan veya int sonundan 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 System.Range biri başlangıç, diğeri de bitiş için olmak üzere iki Index değerden oluşan ve bir x..y aralık ifadesi (C#) ile yazılabilir türü de vardır. Ardından, dilim oluşturan bir Rangeile dizin oluşturabilirsiniz:

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

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

Zaman uyumsuz akışlar

türü IAsyncEnumerable<T> yeni bir zaman uyumsuz sürümüdür IEnumerable<T>. Dil, öğelerini kullanmanızı ve yield return bunları kullanarak öğe oluşturmanızı await foreachIAsyncEnumerable<T> sağlar.

Aşağıdaki örnekte, zaman uyumsuz akışların hem üretimi hem de tüketimi gösterilmektedir. foreach deyimi zaman uyumsuzdur ve çağıranlar için zaman uyumsuz bir akış oluşturmak için kullanılıryield return. Bu desen (kullanarak yield return), zaman uyumsuz akışlar oluşturmak için önerilen modeldir.

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

'yi await foreachkullanabilmenin yanı sıra, hem hem de awaityield içinde kullanabileceğiniz bir yineleyici döndüren bir IAsyncEnumerable/IAsyncEnumerator yineleyici gibi zaman uyumsuz yineleyiciler de oluşturabilirsiniz. Atılması gereken nesneler için, ve gibi StreamTimerçeşitli BCL türlerinin uyguladığı öğesini kullanabilirsinizIAsyncDisposable.

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

IEEE Kayan nokta

Kayan nokta API'leri IEEE 754-2008 düzeltmesiyle uyumlu olacak şekilde güncelleştiriliyor. Bu değişikliklerin amacı, tüm gerekli işlemleri kullanıma sunma ve IEEE belirtimiyle davranışsal olarak uyumlu olduklarından 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önderisine bakın.

Ayrıştırma ve biçimlendirme düzeltmeleri şunlardır:

  • Herhangi bir uzunluktaki girişleri doğru ayrıştırın ve yuvarlayın.
  • Negatif sıfırı doğru ayrıştırıp biçimlendirin.
  • Büyük/küçük harfe duyarlı olmayan bir denetim gerçekleştirerek ve NaN uygun olduğunda isteğe bağlı bir önce izin vererek doğru ayrıştırma.Infinity+

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

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

  • MaxMagnitude(Double, Double) ve MinMagnitude(Double, Double)
    ve minNumMag IEEE işlemlerine maxNumMag karşılık gelir, iki girişin (sırasıyla) büyük veya daha küçük olan değerini döndürür. Örneğin, Math.MaxMagnitude(2.0, -3.0) döndürür -3.0.

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

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

  • Log2(Double)
    IEEE işlemine log2 karşılık gelir, 2 tabanında logaritması döndürür. Yuvarlama hatasını en aza indirir.

  • FusedMultiplyAdd(Double, Double, Double)
    IEEE işlemine fma karşılık gelir, birleştirilmiş çarpma ekleme işlemi gerçekleştirir. Yani, tek bir işlem olarak yapar (x * y) + z ve böylece yuvarlama hatasını en aza indirir. Örnek olarak FusedMultiplyAdd(1e308, 2.0, -1e308)döndürür 1e308. Normal (1e308 * 2.0) - 1e308 , döndürür double.PositiveInfinity.

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

.NET Platforma Bağımlı İç Bilgileri

SIMD veya Bit İşleme yönerge kümeleri gibi belirli performans odaklı CPU yönergelerine erişim sağlayan API'ler eklenmiştir. Bu yönergeler, verileri paralel olarak verimli bir şekilde işleme gibi belirli senaryolarda önemli performans geliştirmeleri elde edilmesine yardımcı olabilir.

Uygunsa, .NET kitaplıkları performansı geliştirmek için bu yönergeleri kullanmaya başlamıştır.

Daha fazla bilgi için bkz . .NET Platforma Bağımlı İç Bilgiler.

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 döndürür. Örneğin:

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ı

Hataya neden olan değişiklik. Sürüm oluşturma düzeni değiştiğinden bu teknik olarak hataya neden olan bir değişikliktir.

Hızlı yerleşik JSON desteği

.NET kullanıcıları büyük ölçüde Newtonsoft.Json'a ve iyi seçenekler olmaya devam eden diğer popüler JSON kitaplıklarına dayanmaktadır. Newtonsoft.Json temel veri türü olarak .NET dizelerini kullanır. Bu, arka planda UTF-16'dır.

Yeni yerleşik JSON desteği yüksek performanslı, düşük ayırmaya sahiptir ve UTF-8 kodlu 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 protokolunu destekler. HTTP/2 etkinse, HTTP protokolü sürümü TLS/ALPN aracılığıyla belirlenir 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 iletisini HTTP/2 kullanacak şekilde ayarlayabilirsiniz:

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 HTTP/2 kullanmak üzere değiştirebilirsiniz HttpClient :

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);

Bir uygulama geliştirirken çoğu zaman şifrelenmemiş bir bağlantı kullanmak istersiniz. Hedef uç noktanın HTTP/2 kullanacağını biliyorsanız, HTTP/2 için şifrelenmemiş bağlantıları açabilirsiniz. Ortam değişkenini DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2UNENCRYPTEDSUPPORT1 olarak ayarlayarak veya uygulama bağlamında etkinleştirerek etkinleştirebilirsiniz:

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

Sonraki adımlar