.NET 9 所有新增功能:终极开发者指南
.NET 9 是微软跨平台框架的最新版本,旨在提升现代应用程序开发,重点关注性能、安全性和易用性。新版本对其运行时、库、SDK 和相关工具进行了重大更新,并引入了面向 AI 开发、Web 和移动应用程序的高级功能。
如果您是一名希望了解所有最新功能的开发人员,本文将详细介绍 .NET 9 中的每一项更新,以便您可以充分利用这个强大的平台。
1. .NET 运行时:增强框架的核心
.NET 9 运行时环境经过优化,可提供卓越的性能,改善开发人员体验,并确保应用程序更加高效和稳定。如果您开发对性能要求很高的应用程序,这些更新将尤其值得关注。
1.1 垃圾回收器 (GC) 优化
.NET 9 中的垃圾回收器持续改进,重点在于减少高内存压力场景下垃圾回收过程中的停顿。如果您曾经遇到过应用程序在处理大量数据时出现轻微卡顿的情况,那么此次更新将为您带来福音。
例如,如果你的应用程序会生成大量临时对象,那么垃圾回收器现在能够更智能地确定回收哪些对象以及何时回收。
这在实践中是如何体现的?
以前,在处理海量列表的应用中,垃圾回收器 (GC) 可能会导致明显的性能中断。现在,由于改进了压缩机制并降低了对象在不同代之间提升的成本,这些中断已显著减少。
代码概览:
var data = Enumerable.Range(1, 10_000_000).ToList();
Console.WriteLine($"Processing {data.Count} items...");
data = null; // Release memory.
GC.Collect(); // Manually invoke the collector.
在这个例子中,.NET 9 中释放和收集内存的过程更快,尤其是在内存使用密集的系统中。
1.2. ARM64 支持
随着 ARM64 架构在服务器和设备中的应用日益广泛,.NET 9 针对该架构引入了特定的优化。这不仅提升了 Raspberry Pi 等 ARM 设备的性能,也提高了采用 ARM 架构的现代服务器的能效。
这对作为开发者的你意味着什么?
如果您的应用程序运行在 AWS Graviton 等 ARM64 环境中,您会发现运行速度更快,资源利用率更高。此外,即时编译 (JIT) 的改进确保您的代码能够更好地适应这些架构。
Console.WriteLine($"Running on: {System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture}");
通过这段代码,您可以验证您的应用程序是否正在利用 ARM64,从而确保您在这些平台上最大限度地发挥性能。
1.3. 应用程序初始化改进
运行时环境现在缩短了 .NET 应用程序的启动时间,这对于微服务和容器化应用程序至关重要。您是否注意到,当应用程序作为 Kubernetes 等编排器的一部分时,启动时间会很长?在 .NET 9 中,通过改进简化初始加载,解决了这个问题。
具体案例:
- 应用程序现在可以加载更优化的配置。
- 初始化程序集所需的时间已显著减少。
var app = WebApplication.CreateBuilder(args).Build();
app.MapGet("/", () => "Hello, .NET 9!");
app.Run();
当您将此最小化应用程序部署到 Docker 容器中时,您会发现与以前的版本相比,启动时间显著缩短。
1.4. 即时 (JIT) 编译更新
.NET 9 中的 JIT 编译器不仅速度更快,而且更加智能。现在,一些以前仅在预编译 (AOT) 中可用的优化功能也适用于 JIT 编译器,从而使具有复杂执行流程的应用程序受益。
开发者优势:
这意味着您可以放心,您的代码会在运行时进行优化,而无需更改其他设置。
int Compute(int x, int y) => x * y + (x / y);
Console.WriteLine(Compute(10, 5));
在 .NET 9 中,这些类型的复杂算术运算利用了编译器级别的优化,运行速度更快,使用的资源更少。
1.5. 增强型性能诊断
在使用诸如dotnet-counters或 之类的工具时dotnet-trace,跨环境组织和保护日志可能成为一项重大挑战。虽然这些工具能够提供深入的洞察,但有效管理日志通常需要额外的工作。一种简化此过程的实用方法是使用ByteHide Logs等解决方案,它将所有应用程序日志集中到一个安全的平台中。这使您可以轻松地筛选和分析日志,同时通过端到端加密确保其安全,并无缝满足合规性和隐私要求。
dotnet-counters monitor --process-id <PID>
将这些工具与运行时优化结合使用,可以识别性能问题并在其影响用户之前解决这些问题。
2. .NET 库:更多工具和灵活性
.NET 9 中的库进行了一系列重大更新,旨在提升性能、安全性和开发者体验。从 JSON 序列化的新功能到 LINQ 的优化,再到对现代加密算法的扩展支持,这些改进旨在使 .NET 开发更加强大高效。
2.1. 更高效的 JSON 序列化
JSON 序列化是 .NET 9 的一个重点改进方向,System.Text.Json其接收方面的增强功能使得处理结构化数据更加轻松快捷。现在,无需复杂的配置即可序列化和反序列化记录类型和不可变结构。
实际例子:
public record Product(string Name, decimal Price);
var product = new Product("Laptop", 1500.75m);
string json = JsonSerializer.Serialize(product);
Console.WriteLine(json); // {"Name":"Laptop","Price":1500.75}
var deserialized = JsonSerializer.Deserialize<Product>(json);
Console.WriteLine(deserialized?.Name); // Laptop
此外,处理大型数据集的能力也得到了提升,从而缩短了数据密集型应用程序的处理时间。
2.2. 告别 BinaryFormatter
微软已在 .NET 9 中正式移除了BinaryFormatter。这一出于安全考虑的决定,鼓励开发者采用更现代的替代方案,例如System.Text.Json、XmlSerializer或像 Protobuf 这样的特定解决方案。
这对你来说意味着什么?
移除此功能促使开发者转向使用诸如ByteHide SecretsBinaryFormatter之类的现代序列化工具System.Text.Json,但这种转变也凸显了安全管理 API 密钥或证书等敏感信息的重要性。许多开发者面临着代码库中敏感数据泄露的风险。ByteHide Secrets 等工具通过安全地存储和动态管理敏感信息来简化这一过程,确保即使应用程序需求不断变化,敏感信息也能保持安全且最新。
2.3. System.Linq 优化
LINQ 是 .NET 中最受欢迎的工具之一,在此版本中得到了显著优化。新TryGetNonEnumeratedCount功能允许您在不完全枚举集合的情况下获取其大小,从而在数据密集型场景中节省时间和资源。
实际例子:
IEnumerable<int> numbers = Enumerable.Range(1, 1000);
if (numbers.TryGetNonEnumeratedCount(out int count))
{
Console.WriteLine($"Number of elements: {count}");
}
此外,由于内部处理能力的提升,像Where和这样的常用操作现在速度更快了。Select
2.4. 扩展的正则表达式支持
.NET 9System.Text.RegularExpressions现在支持预编译正则表达式,从而在模式重用的场景中显著提高性能。
实际例子:
var regex = new Regex(@"\d{4}-\d{2}-\d{2}", RegexOptions.Compiled);
Console.WriteLine(regex.IsMatch("2023-11-19")); // True
这对于处理大量文本的应用程序尤其有用,例如验证和数据分析。
2.5. 使用源生成器进行日志记录
.NET 9 中的日志系统通过使用源生成器进行了优化,允许在编译时生成日志消息。这降低了运行时开销,并提高了生成大量日志的应用程序的效率。
[LoggerMessage(0, LogLevel.Information, "Application started at {StartTime}")]
public static partial void LogAppStart(this ILogger logger, DateTime StartTime);
这不仅可以提高性能,还可以最大限度地减少手动创建日志消息时出现的错误。
2.6. KMAC 算法、ChaCha20-Poly1305 和 HashData
.NET 9 扩展了对现代加密算法的支持,引入了 KMAC 和 ChaCha20-Poly1305。这些算法提供快速安全的加密,尤其适用于移动应用程序、物联网和其他对性能要求极高的环境。
实际例子:
using var chacha20 = new ChaCha20Poly1305(key);
byte[] ciphertext = chacha20.Encrypt(nonce, plaintext, associatedData);
此外,新HashData方法简化了安全哈希的创建:
byte[] hash = SHA256.HashData(Encoding.UTF8.GetBytes("secure data"));
Console.WriteLine(Convert.ToBase64String(hash));
集成 KMAC 和 ChaCha20-Poly1305 等新型加密算法可增强应用程序安全性,但同时也需要对敏感数据进行可靠管理。为此,ByteHide Storage提供了一个理想的解决方案,它原生集成了 Kyber 和 FrodoKEM 等后量子加密协议。即使在云环境中,它也能确保敏感数据始终保持端到端加密,从而有效应对未来不断涌现的计算威胁。
2.7. 支持ref struct
.NET 9 库现在支持ref struct更多场景,为高性能应用程序开辟了新的可能性。这在处理敏感数据或大内存块时尤其有用。
2.8 网络:HTTP/3 及其他
.NET 9 增强了对 HTTP/3 的支持,从而实现了更快、更高效的连接。此外,套接字和System.Net.Http相关工具也得到了优化,以提升依赖网络的应用程序的性能。
如果您使用微服务或现代 API,这些改进将帮助您利用最新的网络协议。
2.9. 反射优化
反射是 ORM 或依赖注入系统等框架的关键工具,在 .NET 9 中效率更高。通过反射检索类型或方法等操作System.Reflection执行速度更快,从而提高了应用程序的整体性能。
Type type = typeof(MyClass);
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);
这些优化对于严重依赖反射的高流量应用程序至关重要。
3. .NET SDK:更智能的工具
.NET 9 SDK 引入了增强版本管理和安全审计的功能:
3.1 工作负载集
.NET 9 简化了工作负载管理并改进了编译流程,因此确保已编译二进制文件的安全性至关重要。ByteHide Shield提供篡改检测和运行时完整性检查等高级功能,可在保持最佳性能和功能的同时,保护您的软件免受未经授权的修改。
3.2 NuGet 中的安全审计
NuGet 改进的安全审计是一项重大进步,但有效管理和保护依赖项仍然需要积极主动的方法。ByteHide Radar等工具通过将软件成分分析 (SCA) 与静态应用程序安全测试 (SAST) 相结合来增强这一过程。这种双重方法不仅可以识别第三方包中的漏洞,还可以识别您代码中的漏洞,从而在开发周期的早期阶段提供可操作的建议来降低风险。
3.3 MSBuild 改进
- 并行测试执行。
- 新增 MSBuild 脚本分析器,用于检测配置问题。
- Shield现已全面支持 .NET 9,并将增强的保护机制直接集成到 MSBuild 流程中。它确保应用程序代码在编译期间的安全,防止逆向工程和篡改,同时保持与现代 .NET 工作流程的无缝兼容性。
4. 人工智能:更广泛的关注点
.NET 9 将自身定位为一个强大的 AI 平台,它提供了新的张量类型和用于操作数据和机器学习模型的库。
4.1 张量基元和张量
这些新类型简化了机器学习模型的复杂数学运算。
例子:
Tensor<float> tensor = new Tensor<float>(new[] { 1.0f, 2.0f, 3.0f });
TensorPrimitives.Add(tensor.Span, 2.0f);
4.2 ML.NET 4.0
- 分词器的新功能。
- 改进了 ONNX 模型加载。
- 与 TorchSharp 集成,用于 Llama 等高级模型。
5. .NET Aspire 9.0:分布式应用程序的创新
.NET Aspire 9.0 带来了一系列重大更新,旨在优化分布式应用程序的开发、编排和管理。该版本充分利用了 .NET 8 (LTS) 和 .NET 9 (STS) 的优势,并针对开发者体验、交互性和集成性进行了多项改进。本文将详细介绍其中最重要的创新。
5.1. 提升开发者体验
通过 SDK 进行全新安装
与之前的版本不同,.NET Aspire 9 简化了环境设置,无需安装工作负载。现在可以直接在应用程序宿主项目中安装 SDK。
更新后的模板安装示例:
dotnet new install Aspire.ProjectTemplates::9.0.0
这使得开发人员在处理多个 Aspire 项目时,初始设置更加敏捷灵活。
5.2. 仪表盘改进:管理和交互性
.NET Aspire 9 控制面板引入了新功能,以简化分布式应用程序的管理。
资源生命周期管理
现在,您可以直接从控制面板停止、启动和重启单个资源,而无需重启整个应用程序主机。这对于快速更改项目、容器或可执行文件非常有用。
示例:重启项目后重新分配调试器:
- 重启后,调试资源会自动重新附加。
移动设备兼容性
现在仪表盘具有响应式设计,允许用户通过移动设备管理应用程序,并获得优化的用户体验。
敏感特性和体积
现在您可以将属性标记为敏感信息,系统会在界面中自动屏蔽这些属性。此外,已配置卷和运行状况检查的可视化效果也得到了改进。
# Command to filter logs with masked sensitive properties
dotnet-aspire dashboard --filter sensitive
5.3. 优化遥测
此版本中的遥测功能更加灵活强大,具有以下特性:
- 高级筛选器:现在您可以按特定属性(例如 HTTP 路由)筛选跟踪。
- 通过浏览器与 OpenTelemetry 集成: Web 应用程序可以将结构化日志、跟踪和指标发送到仪表板。
示例:在单页应用程序 (SPA) 中配置 OpenTelemetry:
import { trace } from '@opentelemetry/api';
trace.getTracer('aspire-tracer').startSpan('Request initiated');
这样可以确保开发人员能够全面了解前端和后端遥测数据。
5.4. 应用主机和编排
等待依赖项
现在您可以定义一个资源,使其在启动前等待另一个资源“准备就绪”。这对于避免容器中的连接错误非常理想。
var rabbit = builder.AddRabbitMQ("rabbit");
builder.AddProject<Projects.Api>("api")
.WithReference(rabbit)
.WaitFor(rabbit);
可配置的健康检查
新增了可配置的健康检查功能,用于判断资源何时处于正常运行状态。这些检查可以基于 HTTP 状态或特定配置。
builder.AddContainer("catalog-api")
.WithHttpHealthCheck("/health")
.WithLifetime(ContainerLifetime.Persistent);
这样可以确保依赖资源只有在完全正常运行时才会启动。
5.5 持久容器
现在您可以定义持久容器,这些容器在应用程序宿主停止运行时不会被删除。这对于需要保持运行状态而不受应用程序生命周期影响的资源非常有用。
示例:创建 RabbitMQ 持久容器:
var queue = builder.AddRabbitMQ("rabbit")
.WithLifetime(ContainerLifetime.Persistent);
5.6. 改进的集成
Redis 洞察
Redis 集成现在包括对Redis Insight的支持,提供图形界面以实时可视化和管理数据。
builder.AddRedis("redis")
.WithRedisInsight();
Azure Functions(预览版)
.NET Aspire 9 引入了对Azure Functions 的初步支持,允许将无服务器函数直接集成到主机中。
示例:在 Azure Functions 中配置 HTTP 函数:
builder.AddAzureFunctionsProject<Projects.MyFunctionApp>("functionapp")
.WithExternalHttpEndpoints();
5.7 Azure 容器应用程序的自定义
已添加 API 以在不修改基础架构文件的情况下自定义 Azure 容器应用程序 (Bicep)。
例如,现在可以通过编程方式将应用程序扩展到零副本:
builder.AddAzurePostgresFlexibleServer("pgsql")
.RunAsContainer()
.PublishAsAzureContainerApp((module, containerApp) =>
{
containerApp.Template.Value!.Scale.Value!.MinReplicas = 0;
});
6. ASP.NET Core 9.0:现代 Web 应用程序的关键改进
ASP.NET Core 9.0 继续巩固其作为构建快速、高效且现代化的 Web 应用程序的理想框架的地位。此版本在静态文件服务方面引入了显著的优化,Blazor 和 SignalR 也新增了功能,并且对最小 API 进行了改进。下面,我们将从开发者的角度探讨这些更新。
6.1 静态资产交付优化
这项新MapStaticAssets功能彻底革新了 ASP.NET Core 应用程序提供静态文件的方式。现在,无需复杂的手动配置即可实现压缩、缓存和 ETag 使用等生产环境最佳实践。
MapStaticAssets 有何不同之处?
- 高级压缩:开发环境支持 gzip,生产环境支持 gzip + Brotli。
- 基于内容的 ETag:确保浏览器仅在内容发生更改时才下载文件。
- 缩小尺寸:以 MudBlazor 为例:
- 原始文件大小:588.4 KB。
- 压缩后:46.7 KB(减少了 92%)。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
何时使用?
大多数情况下都需要替换UseStaticFiles,但从外部位置(例如磁盘)提供文件时除外。
6.2. Blazor:更多集成和新功能
Blazor 和 .NET MAUI 混合解决方案模板
新的模板简化了创建共享同一用户界面的原生应用和 Web 应用的过程。这种方法有利于代码重用,并支持 Android、iOS、Mac、Windows 和 Web 等多个平台。
dotnet new maui-blazor-web
改进的服务器端重连接
- 浏览器返回休眠标签页时立即重新连接。
- 可配置的退避策略,用于自定义重试间隔。
Blazor.start({
circuit: {
reconnectionOptions: {
retryIntervalMilliseconds: (previousAttempts) => previousAttempts * 1000,
},
},
});
6.3 SignalR:增强型实时通信
Hub 中对多态类型的支持
SignalR 现在允许使用基类在 Hub 方法中实现多态场景。
[JsonPolymorphic]
[JsonDerivedType(typeof(JsonPersonExtended))]
public class JsonPerson { public string Name { get; set; } }
public class MyHub : Hub
{
public void HandlePerson(JsonPerson person) => Console.WriteLine(person.Name);
}
SignalR 等实时通信框架带来了强大的交互性,但也引入了运行时安全漏洞。确保运行时安全至关重要,尤其是在分布式或物联网环境中。借助ByteHide Monitor,您可以动态检测并消除运行时威胁,从而持续保护您的应用程序,即使在无法保证安全环境的情况下也能让您高枕无忧。
交互式组件的 WebSocket 压缩
SignalR 默认启用 WebSocket 压缩,从而提高实时连接的效率。
6.4. 最小 API:简化和可扩展性
TypedResults 中的新方法
ASP.NET Core 9.0 引入了新的方法TypedResults,例如InternalServerError,这有助于在最小 API 中进行错误处理。
app.MapGet("/", () => TypedResults.InternalServerError("Internal error"));
OpenAPI 兼容性
现在您可以直接从控制器或最小 API 生成 OpenAPI 文档,并支持原生 AOT。
builder.Services.AddOpenApi();
app.MapOpenApi();
6.5 其他改进
- 与 Bootstrap 5.3.3 和 jQuery 3.7.1 集成。
- 更新了对 OpenID Connect 身份验证和授权的支持。
- Kestrel 中的高级指标:包括连接关闭的详细原因。
7. C# 13:11 项最值得关注的语言更新
基于Mads Torgersen和Dustin Campbell在 .NET Conf 2024 大会上精彩的演讲,我们整理了一份 C# 13 中最令人兴奋的新特性和增强功能的简明摘要。这份概述重点介绍了旨在提高开发人员效率、简化编码工作流程以及扩展语言功能以支持现代应用程序的关键改进。敬请关注,我们将深入探讨 C# 13 如何成为 .NET 生态系统的变革者。
随着 C# 13 的到来,开发人员可以使用旨在提高生产力、减少重复代码并充分利用 .NET 9 的新工具和功能。以下是此版本中引入的 11 项更新的完整介绍。
7.1. 更灵活的字符串插值
最受期待的更新之一是能够直接在字符串中嵌套插值表达式。这省去了额外的字符串拼接操作。
int x = 5, y = 10;
Console.WriteLine($"The sum of {x} and {y} is {x + y}");
现在您可以构建更复杂的字符串,而无需担心错误或清晰度不足。
7.2. 属性中的命名参数
C# 13 允许使用参数名称将参数传递给属性,这提高了可读性,并减少了处理元数据时的错误。
[ExampleAttribute(Required = true, Message = "This field is required")]
public string Field { get; set; }
当处理具有多个可选参数的属性时,这种语法尤其有用。
7.3.ref fields结构改进
.NET 9 中对内存的优化处理ref struct使开发人员能够提升内存密集型应用程序的性能。然而,保护这些性能关键组件同样重要。ByteHide Shield等解决方案结合了强大的混淆技术、控制流保护和反调试措施,从而保护您的知识产权,使攻击者几乎不可能对您的软件进行逆向工程或篡改。
ref struct MyStruct
{
public ref int MyField;
public MyStruct(ref int value)
{
MyField = ref value;
}
}
这极大地有利于处理敏感或复杂数据的高性能应用程序。
7.4. 集合表达式中的列表初始化
C# 13 引入了更简洁的列表和集合初始化语法,消除了对冗长初始化器的需要。
var numbers = [1, 2, 3, 4, 5];
这种新语法使代码更加直观,尤其是在处理大型数据结构时。
7.5. 安全访问可空属性
安全访问运算符现在扩展到对象初始化器,提高了复杂结构的安全性和可读性。
var person = new Person
{
Name = anotherObject?.Property ?? "Unknown"
};
这样可以降低处理可能为空的数据时出现运行时异常的风险。
7.6. 改进readonly struct
现在可以声明扩展方法,readonly struct而不会失去不可变性带来的好处。
public readonly struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
public int CalculateDistance() => Math.Abs(X - Y);
}
这一改进简化了对不可变结构体的使用,使代码更清晰、更高效。
7.7. 改进的恒定处理
C# 13 允许定义以前不可能定义的常量,例如DateTime值。
public const DateTime StartDate = new DateTime(2024, 1, 1);
这样可以更方便地在配置和静态数据中使用预定义的常量。
7.8. 模式匹配的变化
引入了多项改进,扩展了 的功能pattern matching,包括支持更复杂的逻辑模式。
if (obj is int i and > 0)
{
Console.WriteLine($"Positive number: {i}");
}
这些更新使代码更具表达力,更不容易出错。
7.9. 改进了switch类型表达式
现在您可以将类型表达式和模式组合成更简洁的switch语句。
string GetMessage(object obj) => obj switch
{
int i => $"It's a number: {i}",
string s => $"It's a string: {s}",
_ => "Unknown type"
};
这种方法简化了逻辑,提高了代码的清晰度。
7.10. 字符串插值的新功能
现在可以在更多上下文中使用插值表达式,例如属性初始化器。
var message = new { Text = $"Hello, {user.Name}" };
这使得处理动态字符串变得更加自然。
7.11. 增强型通用约束
最后,C# 13 在泛型约束中引入了新功能,从而可以实现更灵活、更强大的方法定义。
public static void Process<T>(T element) where T : notnull
{
Console.WriteLine(element);
}
这些改进对于能够安全处理多种数据类型的库来说至关重要。
8. F# 9 的新特性
F# 9 新增了专注于安全性和生产力的功能:
- 支持可空引用类型。
.Is*为受歧视工会提供的财产。- 部分激活模式现在可以恢复
bool。 - 更倾向于使用扩展方法而非内在属性。
- 用于计算表达式构建器的空表达式。
- 新增集合随机化函数。
- 提高了与 C# 集合的兼容性。
9. .NET MAUI for .NET 9 的新特性:为跨平台应用程序提供更强大的功能和更大的灵活性
.NET MAUI(多平台应用用户界面)第 9 版着重提升产品质量并扩展其功能。凭借全新的控件、性能改进和开发者工具,此次更新为 Android、iOS、Mac Catalyst 和 Windows 平台的跨平台应用树立了更高的标准。
9.1 最低部署要求
.NET MAUI 9 更新了其部署目标:
- iOS:最低版本要求为 12.2。
- Mac Catalyst:最低要求版本为 15.0(macOS 12.0)。
- Android 和 Windows:与之前的版本相比没有变化。
9.2. 新控制
混合Web视图
HybridWebView控件允许在原生.NET MAUI应用程序中直接托管HTML、CSS和JavaScript内容。它还促进了JavaScript代码和C#之间的双向通信。
主要用途:
- 非常适合将 React 或 Angular 等现有 Web 应用程序集成到 MAUI 应用程序中。
- 允许在设备上执行本地 Web 内容。
<HybridWebView Source="index.html"
HostPage="wwwroot/index.html" />
Windows 标题栏
现在您可以使用TitleBar控件自定义 Windows 应用程序的标题栏。
XAML 示例:
<Window.TitleBar>
<TitleBar Title="My Application"
Icon="icon.png"
HeightRequest="46">
<TitleBar.Content>
<SearchBar Placeholder="Search here"
HorizontalOptions="Fill"
VerticalOptions="Center" />
</TitleBar.Content>
</TitleBar>
</Window.TitleBar>
主要特点:
- 完全可自定义:添加主要内容、起始内容和结束内容。
- 支持深色和浅色主题。
- 即将支持:未来版本将支持 Mac Catalyst。
9.3. 对现有控制措施的改进
BlazorWebView
- 在 iOS 和 Mac Catalyst 上,BlazorWebView内容现在默认托管在 [此处应填写托管位置]
localhost,从而提高了稳定性。 - 引入异步处置的“即发即弃”选项,降低死锁风险。
CollectionView 和 CarouselView
- 新增了可选处理程序,以提高 iOS 和 Mac Catalyst 上的性能和稳定性。
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<CollectionView, CollectionViewHandler2>();
handlers.AddHandler<CarouselView, CarouselViewHandler2>();
});
软键盘
扩展了对特定输入类型的支持,例如:
- 密码、日期和时间
Entry等控件Editor。
<Entry Keyboard="Date" />
9.4. 代码和 XAML 中的编译绑定
代码中的编译绑定
.NET MAUI 9 引入了编译绑定,消除了使用字符串作为属性路径的需求,从而减少了错误并提高了性能。
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);
优势:
- 编译时绑定验证。
- 更好的调试体验。
- NativeAOT 提供全面支持。
9.5. 使用原生 AOT 和完全修剪进行编译
Native AOT
.NET MAUI 9 为 iOS 和 Mac Catalyst 启用了预先编译 (AOT) 功能。这使得应用程序具有以下特点:
- 缩小2.5倍。
- 启动速度提升2倍。
完全修剪
从应用程序中移除不必要的代码以减小其体积。可在项目文件中配置:
<PropertyGroup>
<TrimMode>Full</TrimMode>
</PropertyGroup>
限制:某些功能(例如HybridWebView)与完全修剪不兼容。
9.6 项目模板和实际示例
新增模板包括:
- 待办事项列表应用:基于 SQLite,借助 Syncfusion 工具包实现可视化。
- Blazor混合模板:使用Blazor将原生应用程序和Web应用程序结合起来。
dotnet new maui --sample-content -n MyProject
dotnet new maui-blazor-web -n MyBlazorProject
9.7. 原生 API 和多窗口支持
原生 API
.NET MAUI 现在包含用于原生集成场景的完整 API,简化了 .NET MAUI 视图与其原生等效视图的转换。
var nativeView = mauiView.ToPlatform(mauiApp.Services);
多窗口支持
能够在 Mac Catalyst 和 Windows 系统上激活特定窗口:
Application.Current?.ActivateWindow(windowToActivate);
9.8. 兼容性和已弃用的 API
主要弃用项:
- 控件
Frame已被替换为Border。 - 该
MainPage物业现在具备了Window.Page更大的灵活性。
扩展兼容性:
- 完全支持 iOS 18 和 Mac Catalyst 15,以及 Xcode 16。
- Android API 级别 35。
10. .NET 9 中的 WPF:重塑桌面 UI 开发
Windows Presentation Foundation (WPF) 不断发展,为桌面应用程序开发提供现代化且灵活的工具。在 .NET 9 中,WPF 专注于增强视觉功能并引入新功能,例如支持 Fluent 主题和 Windows 强调色。本文将详细介绍所有更新内容。
10.1. Fluent Theme:适用于 Windows 11 的现代风格
全新的Fluent 主题引入了更现代、更一致的视觉设计,与 Windows 11 保持一致。该主题支持浅色和深色模式,并与系统强调色集成。
如何应用?
您可以通过两种方式使用 Fluent 主题:
ThemeMode在应用程序或窗口级别进行配置。- 在 XAML 文件中引用 Fluent 主题资源字典:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这种集成确保 WPF 应用程序保持符合用户期望的最新设计。
10.2.ThemeMode动态样式配置属性
这项新ThemeMode属性让您可以更轻松地直接在应用程序或特定窗口中配置 Fluent 主题。您可以定义应用程序是否遵循系统模式、固定使用浅色或深色模式,或者使用经典的 Aero2 主题。
示例:在窗口级别配置深色模式:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Main Window"
ThemeMode="Dark">
</Window>
这种灵活的方法简化了应用程序的定制,并确保了跨设备的一致体验。
10.3. 自定义强调色
WPF 现在允许利用用户在 Windows 中配置的强调色,为界面增添个性化元素。它还提供了该颜色的浅色和深色版本,可随时在应用程序中动态使用。
如何使用强调色?
<TextBlock Text="Welcome"
Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />
通过这种配置,系统主题色的任何更改都会自动反映在应用程序中,而无需重新启动。
10.4. 基于连字符的连接支持
应社区要求,.NET 9 中的 WPF 为文本控件(例如 <code><br></code>)添加了对基于连字符的连字的支持TextBlock。这显著改善了依赖高级字体的应用程序的排版美观性。
在 .NET 8 中:
在 .NET 9 中 🔥
10.5. 移除 BinaryFormatter
作为持续改进安全性工作的一部分,WPF 完全移除了 `__init__` BinaryFormatter,因为它被认为存在反序列化漏洞,因此不安全。现在,任何尝试使用它的行为都会抛出异常PlatformNotSupportedException。
如果您仍然使用 BinaryFormatter,该怎么办?
为了安全地处理数据,您应该迁移到更现代的替代方案,例如System.Text.Json或XmlSerializer。
11. .NET 9 中的 Windows Forms:现代桌面应用程序的新功能
Windows Forms 仍然是 Windows 平台上开发桌面应用程序的可靠解决方案。.NET 9 为该平台带来了功能、兼容性和设计方面的关键改进,集成了诸多现代特性,使桌面应用程序更加高效且更具视觉吸引力。以下是其中最重要的更新。
11.1. 异步表单(实验性)
现代开发需要兼容异步通信模型。在 .NET 9 中,Windows Forms 新增了对异步窗体的实验性支持,包括 ` on` Form.ShowAsync、Form.ShowDialogAsync`on` 和 `on`等方法Control.InvokeAsync。这使得处理需要与 UI 线程同步的操作成为可能,例如 WebView2 或 Semantic Kernel 等库的操作。
使用此功能的配置:
要启用这些实验性 API,请将以下配置添加到项目文件中:
<PropertyGroup>
<NoWarn>$(NoWarn);WFO5002</NoWarn>
</PropertyGroup>
对于集成多个框架或需要在异步组件之间进行顺畅通信的应用程序而言,这项进步至关重要。
11.2. 告别 BinaryFormatter
为了遵循最佳安全实践,Windows Forms 已移除对 `String` 类的使用BinaryFormatter,该类容易受到反序列化攻击。现在,尝试使用此功能将抛出异常PlatformNotSupportedException。
Windows Forms 内部已将此依赖项替换为更安全的子集,以用于特定场景,例如剪贴板操作和窗体设计器。
这意味着什么?
如果你仍然依赖于,那么迁移到现代替代方案(例如或)BinaryFormatter至关重要。System.Text.JsonXmlSerializer
11.3. 对深色模式的实验性支持
.NET 9 为 Windows Forms 引入了对深色模式的初步支持,并计划在 .NET 10 中完善该功能。现在,您只需一行简单的代码即可设置系统颜色模式:
Application.SetColorMode(SystemColorMode.Dark);
深色模式非常适合需要遵循系统偏好设置或在弱光环境下提供更舒适体验的应用程序。
可用模式:
SystemColorMode.Classic浅色模式,与之前的版本相同。SystemColorMode.System:遵循Windows设置。SystemColorMode.Dark直接激活深色模式。
11.4. 文件夹浏览对话框的改进
用户呼声最高的改进之一是能够在 中选择多个文件夹FolderBrowserDialog。现在可以通过设置Multiselect属性来实现这一点true。
var dialog = new FolderBrowserDialog
{
Multiselect = true
};
if (dialog.ShowDialog() == DialogResult.OK)
{
foreach (var path in dialog.SelectedPaths)
{
Console.WriteLine($"Selected folder: {path}");
}
}
这简化了跨多个目录的批量操作等任务。
11.5. 系统绘图的新功能
图书馆System.Drawing已进行多项改进,其中包括:
使用 GDI+ 的图像特效
现在可以直接对位图应用高级视觉效果,例如模糊、对比度调整和色调调整。
var bitmap = new Bitmap("image.jpg");
var effect = new System.Drawing.Imaging.Effects.BlurEffect();
bitmap.ApplyEffect(effect, Rectangle.Empty);
这些功能允许您在无需外部工具的情况下,为应用程序添加高质量的图形。
跨度兼容性
许多以前只接受数组的方法现在都支持数组ReadOnlySpan,从而优化了内存处理并提高了性能。
Graphics.DrawLines(Pens.Black, new ReadOnlySpan<Point>(points));
11.6. 工具栏的改进
该ToolStrip控件现在包含新的属性和事件,从而增强了其功能:
AllowClickThrough即使窗口未获得焦点,也允许与控件进行交互。SelectedChanged: 检测菜单项何时被突出显示的事件,取代已弃用的功能MenuItem.Select。
var toolStripItem = new ToolStripMenuItem("File");
toolStripItem.SelectedChanged += (sender, args) => Console.WriteLine("Item selected");
这些改进使得构建更动态、更实用的菜单成为可能。
随着我们迈入软件开发的新时代,.NET 9 作为一个强大的平台应运而生,它赋能开发者构建更安全、高效且更具创新性的应用程序。.NET 9 在各个领域都取得了进步,从使用 Windows Forms 和 WPF 实现桌面应用程序的现代化,到利用 .NET MAUI 增强跨平台功能,它能够满足广泛的开发需求。
.NET 9 包含了 C# 和 F# 的更新,并集成了新的性能和安全特性,确保 .NET 开发人员拥有最先进的工具,从而在不断发展的技术环境中保持领先地位。无论您是开发 Web 应用、移动应用还是桌面应用,.NET 9 都能为您带来宝贵的价值。
抓住机会,探索这些新功能,体验最新的改进,并继续使用 .NET 9 构建软件的未来。创新之旅才刚刚开始,工具现在就在你手中。
文章来源:https://dev.to/bytehide/everything-new-in-net-9-the-ultimate-developers-guide-331e















