.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:
- Öğretici: tasarım amacınızı null olabilen ve null yapılamayan başvuru türleriyle daha net bir şekilde Ifade edin
- Öğretici: C# 8,0 ve .NET Core 3,0 kullanarak zaman uyumsuz akışlar oluşturma ve kullanma
- Öğretici: tür odaklı ve veri odaklı algoritmalar oluşturmak için model eşleştirmeyi kullanın
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 build
olarak 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 gibimyapp.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:
<PublishReadyToRun>
Ayarı projenize ekleyin:<PropertyGroup> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup>
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=1
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 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ıç, Index
x..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 Range
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
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 IAsyncDisposable
BCL türlerinin uygulayan kullanabilirsiniz Stream
Timer
.
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ükNaN
/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)
nextUp
nextDown
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)
maxNumMag
minNumMag
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ğerlogB
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ırfloor(log2(x))
, ancak minimum yuvarlama hatasıyla yapılır.ScaleB(Double, Int32)
İntegral birscaleB
değer alan IEEE işlemine karşılık gelir, etkili bir şekilde döndürürx * 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ğidir1e308
. Normal işlevi(1e308 * 2.0) - 1e308
döndürürdouble.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:
- .NET'te JSON serileştirmesi - genel bakış
- .NET'te JSON'u seri hale getirme ve seri halinden nasıl serileştirme.
- Newtonsoft.Json'dan System.Text.Json'a geçiş
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);