.NET 多平台应用 UI(.NET MAUI)在 .NET 10 中的重点是提高产品质量。 有关 .NET 10 版本中每个 .NET MAUI 中的新增功能的信息,请参阅以下发行说明:
- .NET 10 候选版本 1 中的 .NET MAUI
- .NET 10 预览版 7 中的 .NET MAUI
- .NET 10 预览版 6 中的 .NET MAUI
- .NET MAUI 在 .NET 10 预览版 5 中
- .NET 10 预览版 4 中的 .NET MAUI
- .NET 10 预览版 3 中的 .NET MAUI
- .NET MAUI 在 .NET 10 预览版 2 中
- .NET MAUI 在 .NET 10 预览版 1 中
重要
由于使用外部依赖项(例如 Xcode 或 Android SDK Tools),.NET MAUI 支持策略与 .NET 和 .NET Core 支持策略不同。 有关详细信息,请参阅 .NET MAUI 支持策略。
在 .NET 10 中,.NET MAUI 作为 .NET 工作负载和多个 NuGet 包提供。 这种方法的优势在于,它使你能够轻松地将项目固定到特定版本,同时使你能够轻松预览未发布的版本或实验性版本。
.NET Aspire 集成
.NET 10 的 .NET MAUI 包含一个新的项目模板,该模板用于创建一个适用于 .NET MAUI 的 .NET Aspire 服务默认项目。 这提供了一组扩展方法,将遥测和服务发现连接到您的应用程序。
要将遥测和服务发现连接到您的应用程序,请在 CreateMauiApp 类中修改 MauiProgram 方法,以在 AddServiceDefaults 对象上调用来自 .NET Aspire 服务默认项目的 MauiAppBuilder 方法。
builder.AddServiceDefaults();
AddServiceDefaults 方法执行以下任务:
- 配置 OpenTelemetry 指标和追踪。
- 增加服务发现功能。
- 配置HttpClient以与服务发现一起工作。
重要
.NET Aspire 服务默认项目旨在共享 Extensions.cs 文件及其功能。 请不要在此项目中包含其他共享功能或模型。 相反,应使用共享类库项目来实现这些目的。
有关更多信息,请参见 .NET Aspire 服务默认值。
动画
FadeTo、LayoutTo、RelRotateTo、RelScaleTo、RotateTo、RotateXTo、RotateYTo、ScaleTo、ScaleXTo、ScaleYTo和TranslateTo方法已被弃用,并用FadeToAsync、LayoutToAsync、RelRotateToAsync、RelScaleToAsync、RotateToAsync、RotateXToAsync、RotateYToAsync、ScaleToAsync、ScaleXToAsync、ScaleYToAsync和TranslateToAsync方法替代。
欲了解更多信息,请参见基础动画。
控件
.NET 10 中的 .NET MAUI 包括控件增强和弃用功能。
加速器
从 Microsoft.Maui.Controls 中删除。 使用 KeyboardAccelerator。
ClickGestureRecognizer
删除。 使用 TapGestureRecognizer。
CollectionView 和 CarouselView
.NET 9 中的 .NET MAUI 在 iOS 和 Mac Catalyst 上包含了两个可选的处理程序,为 CollectionView 和 CarouselView带来了性能和稳定性改进。 在 .NET 10 中,这些是 CollectionView 和 CarouselView的默认处理程序。
兼容性.布局
现在已从模板和版本中删除。 使用 .NET MAUI 布局。
编辑和输入 (Android)
在安卓平台上,Editor 和 Entry 视图将它们的原生视图从 AppCompatEditText 更改为 MauiAppCompatEditText,这增加了对 SelectionChanged 事件的支持。
HybridWebView
HybridWebView 获得一个 InvokeJavaScriptAsync 重载,该重载调用指定的 JavaScript 方法,但不包括返回类型的任何信息。 有关详细信息,请参阅 调用不返回值的 JavaScript 方法。
默认情况下,由您的JavaScript代码抛出的任何异常都会发送到.NET,然后在.NET中重新抛出为.NET异常。
此外,您还可以自定义初始化,并访问平台的 Web 视图,以便在本机视图就绪后调整设置(例如,在 Windows 系统中使用 RunAfterInitialize,或在 iOS/Mac Catalyst 中调整 WKWebView 配置)。 有关详细信息,请参阅 自定义初始化和访问平台 Web 视图。
新建事件
将初始化事件添加到 HybridWebView,遵循与 BlazorWebView 相同的模式,从而在初始化之前和之后启用特定于平台的自定义。
-
WebViewInitializing- 在WebView创建之前触发,允许配置平台特定初始化参数 -
WebViewInitialized- 在创建WebView后触发,提供对原生WebView实例和设置的访问权限
截获 Web 请求
现在可以截获和响应来自 BlazorWebView 和 HybridWebView的 Web 请求。 这允许修改标头、重定向请求或提供本地响应等方案。
webView.WebResourceRequested += (s, e) =>
{
if (e.Uri.ToString().Contains("api/secure"))
{
e.Handled = true;
e.SetResponse(200, "OK", "application/json", GetCustomStream());
}
};
XAML 的另一个示例:
<HybridWebView WebResourceRequested="HybridWebView_WebResourceRequested" />
private void HybridWebView_WebResourceRequested(object sender, HybridWebViewWebResourceRequestedEventArgs e)
{
// NOTES:
// * This method MUST be synchronous, as it is called from the WebView's thread.
// * This method MUST return a response (even if it is not yet complete), otherwise the
// WebView may freeze or return a error response.
// * The response must be set using the SetResponse method of the event args.
// Only handle requests for the specific image URL
if (!e.Uri.ToString().Contains("sample-image.png"))
return;
// Prevent the default behavior of the web view
e.Handled = true;
// Return the stream or task of stream that contains the content
// NOTE: the method is NOT awaited, the WebView will continue to load the content
e.SetResponse(200, "OK", "image/png", GetStreamAsync());
}
列表视图
ListView 已被弃用,和 EntryCell、ImageCell、SwitchCell、TextCell、以及 ViewCell 一样。 相反,应使用 CollectionView。
注释
Cell 尚未弃用,因为它目前用于源代码生成。 然而,它应该被视为已弃用。
页
该 IsBusy 属性标记为已过时。 在 .NET 10 中,建议对页面或视图特定的繁忙状态使用 ActivityIndicator(或类似的 UX),并避免使用长期存在的全局繁忙指示器。 有关指南,请参阅 ContentPage。
选取器
使用新的 Open/Close API 以编程方式控制选取器状态。
此外,DatePicker 和 TimePicker 支持 .NET 10 中的可空选择。 这样就可以清除值并绑定到可以为 null 的类型:
- Date 现在 DateTime为 null; MinimumDate 也可以 MaximumDate 为 null。
- Time 现为 TimeSpan。
有关示例和平台说明,请参阅 DatePicker 和 TimePicker。
RefreshView
添加了属性 IsRefreshEnabled 以区别于 IsEnabled,使其行为在各个平台上一致。
<RefreshView IsRefreshEnabled="false">
<!-- Login form remains usable -->
<StackLayout>
<Entry Placeholder="Username" />
<Entry Placeholder="Password" />
<Button Text="Login" />
</StackLayout>
</RefreshView>
搜索栏
SearchBar 获得了一个 SearchIconColor 可绑定属性,用于设置搜索图标的颜色:
<SearchBar Placeholder="Search items..."
SearchIconColor="Blue" />
SearchBar 还获得一个可绑定的 ReturnType 属性,类型为 ReturnType,用于指定返回按钮的外观。 此属性的默认值为 Search。
有关详细信息,请参阅 SearchBar。
开关
Switch 拥有一个 OffColor 可绑定属性,用于设置开关在关闭状态时的颜色。
<Switch OffColor="Red"
OnColor="Green" />
有关详细信息,请参阅 开关。
表格视图
TableView 已弃用。 相反,应使用 CollectionView。
振动和触觉反馈
已添加 IsSupported 以检查平台支持。
Android上的WebView
当视频托管在 Android 的WebView中时,现在可以通过在allowfullscreen中包含iframe来全屏播放。
有关详细信息,请参阅 “播放视频全屏”。
还可以使用 .NET 10 平台特定的 API 以编程方式在 Android 上启用或禁用 JavaScript 执行。 有关详细信息和代码示例,请参阅 WebView。
SearchHandler
SearchHandler 添加 API 以编程方式显示或隐藏软键盘,以便更轻松地控制焦点和用户输入流:
ShowSoftInputAsyncHideSoftInputAsync
有关示例和平台说明,请参阅 “搜索”。 如果使用基于反射的属性(例如DisplayMemberName),请查看功能切换和链接器配置的剪裁指南。
壳牌
.NET 10 引入了一个开关来控制 shell 导航栏可见性动画。 用于 Shell.NavBarVisibilityAnimationEnabled 在导航栏显示或隐藏时启用或禁用动画。 请参阅 Shell 外观和行为。
Diagnostics
我们为 .NET MAUI 应用程序新增了全面的诊断和指标跟踪,重点关注利用可扩展体系结构进行的布局性能监视,以满足将来的可观测性需求。
核心诊断基础结构:
-
ActivitySource:
"Microsoft.Maui"- 使用详细计时跟踪布局操作 -
指标:
"Microsoft.Maui"- 记录用于性能分析的计数器和直方图 -
功能开关:
System.Diagnostics.Metrics.Meter.IsSupported- 在运行时启用/禁用用于 AOT(提前编译)/裁剪
布局性能跟踪:
- 仪器
IView.Measure()和IView.Arrange()操作 - 记录时序数据和操作计数,并使用丰富的上下文标记
- 使用
using模式基于零分配结构的检测
| 指标名称 | 类型 | Description |
|---|---|---|
maui.layout.measure_count |
Counter | 测量操作次数 |
maui.layout.measure_duration |
直方图 | 测量时间(ns) |
maui.layout.arrange_count |
Counter | 排列操作的数量 |
maui.layout.arrange_duration |
直方图 | 安排时间(ns) |
有关更多详细信息,请参阅拉取请求 #31058。
窗口
添加了在 Windows 上启用/禁用最小化和最大化按钮的功能。
消息中心
MessagingCenter 已在 .NET 10 中被设为内部使用。 在 WeakReferenceMessenger NuGet 包中,代码中的用法可以替换为 。 有关详细信息,请参阅 Messenger。
平台功能
.NET MAUI 的平台功能在 .NET 10 中获得了一些更新。
在 iOS 和 Mac Catalyst 上将模式页面显示为弹出式页面
适用于 .NET 10 的 .NET MAUI 添加了一个特定于平台的功能,可以在 iOS 和 Mac Catalyst 上将模态页面显示为弹出式页面。 通过将Page.ModalPopoverSourceView可绑定属性设置为定义模态来源的View,将Page.ModalPopoverRect可绑定属性设置为定义弹出框将从其发起的视图内矩形的Rectangle,并将Page.ModalPresentationStyle可绑定属性设置为Popover,来使用它。
using Microsoft.Maui.Controls.PlatformConfiguration;
using Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;
public partial class PopoverPage : ContentPage
{
public PopoverPage(View modal, Rectangle rectangle)
{
InitializeComponent();
On<iOS>().SetModalPopoverView(modal);
On<iOS>().SetModalPopoverRect(rectangle);
On<iOS>().SetModalPresentationStyle(UIModalPresentationStyle.Popover);
}
}
然后,使用 Navigation.PushModalAsync 方法导航到模式页:
Page modalPage = new PopoverPage(originButton, Rectangle.Empty);
await Navigation.PushModalAsync(modalPage);
有关详细信息,请参阅 在 iOS 和 Mac Catalyst上以弹出窗口的形式显示模态页面。
地理位置
Geolocation 类获得一个只读的 IsEnabled 属性,该属性可用于确定设备上是否已启用位置服务。
iOS 和 Mac Catalyst 兼容性辅助功能扩展
以下 iOS 兼容性 AccessibilityExtensions 扩展方法在 Microsoft.Maui.Controls.Compatibility.Platform.iOS中已被弃用:
SetAccessibilityHintSetAccessibilityLabelSetAccessibilityHintSetAccessibilityLabel
应改用 Microsoft.Maui.Platform.UpdateSemantics 方法。
iOS 和 Mac Catalyst 的 MauiWebViewNavigationDelegate 方法重写
以下位于 MauiWebViewNavigationDelegate 命名空间中的 Microsoft.Maui.Platform 方法现在可以被重写:
DecidePolicyDidFailNavigationDidFailProvisionalNavigationDidFinishNavigation
MediaPicker
EXIF
MediaPicker 现在在处理图像时会自动处理 EXIF 信息。
- 自动旋转图像:图像根据其 EXIF 方向数据自动旋转
- 保留 EXIF 信息:使用 MediaPicker 时保留原始 EXIF 元数据
这可确保图像无论在设备上如何捕获或存储,都能以正确方向显示。
按大小选取
MediaPicker已扩展,现支持通过 API 使用MaximumWidth和MaximumHeight参数直接选择多个文件并压缩图像。
var result = await MediaPicker.PickMultipleAsync(new MediaPickerOptions
{
MaximumWidth = 1024,
MaximumHeight = 768
});
文本到语音转换
SpeechOptions 类获得一个 Rate 属性,该属性控制使用 TextToSpeech 功能时的语音速率。 有关详细信息,请参阅 文本转语音设置。
Web 身份验证
WebAuthenticator 增加了一个 AuthenticateAsync 方法重载,该重载允许通过 CancellationToken 参数以编程方式取消身份验证流程。
弹窗
DisplayAlert和DisplayActionSheet方法已被弃用,并被DisplayAlertAsync和DisplayActionSheetAsync方法替代。
欲了解更多信息,请参阅显示弹出窗口。
SafeArea 增强功能
此版本对 SafeArea 管理引入了重大改进:
- 增强的 SafeAreaEdges 控件:优化了 枚举的
SafeAreaEdges属性,以精确管理安全区域行为。 - iOS SafeArea 修复:解决了 iOS 上的 SafeArea 管理功能问题,包括在使用 SafeAreaEdges 时,ScrollView 中出现的额外底部空间
- 改进了默认值:修复了安全区域默认值,以跨平台提供更一致的行为
这些控件上提供了该 SafeAreaEdges 属性:
-
布局:基础布局类(继承者
Grid、StackLayout、AbsoluteLayout、FlexLayout等) - ContentView:内容视图容器
- ContentPage:主页类型
- 边境:边境管理
- ScrollView:可滚动内容容器
SafeAreaEdges枚举提供对安全区域行为的精细控制:
public enum SafeAreaEdges
{
None = 0, // Edge-to-edge content (no safe area padding)
SoftInput = 1, // Always pad for keyboard/soft input
Container = 2, // Flow under keyboard, stay out of bars/notch
Default = 4, // Platform default behavior
All = int.MaxValue // Obey all safe area insets
}
// Usage examples
<ContentPage SafeAreaEdges="Container">
<!-- Content flows under keyboard but respects bars/notch -->
</ContentPage>
<ScrollView SafeAreaEdges="None">
<!-- Edge-to-edge scrolling content -->
</ScrollView>
<Grid SafeAreaEdges="SoftInput">
<!-- Grid respects keyboard but not other safe areas -->
</Grid>
有关详细信息,请参阅 “安全区域”布局。
辅助工具栏项
iOS 和 macOS 现在支持辅助工具栏项,从而更好地与平台约定保持一致:
- 新式 iOS 模式:遵循 iOS 人机界面指南,将 iOS 13+ API 与下拉菜单设计配合使用
-
自动检测:带有
Order="Secondary"的工具栏项会自动分组到二级菜单中 -
优先级排序:项根据其
Priority属性在辅助菜单中排序 - 平台定位:菜单显示在最右侧(或启用 RTL 时左侧)
- 可自定义图标:开发人员可以通过受保护的虚拟方法替代默认省略号图标
<ContentPage.ToolbarItems>
<!-- Primary toolbar items appear directly in the toolbar -->
<ToolbarItem Text="Save" Order="Primary" Priority="0" />
<ToolbarItem Text="Edit" Order="Primary" Priority="1" />
<!-- Secondary toolbar items appear in the overflow menu -->
<ToolbarItem Text="Share" Order="Secondary" Priority="0" />
<ToolbarItem Text="Delete" Order="Secondary" Priority="1" />
<ToolbarItem Text="Settings" Order="Secondary" Priority="2" />
</ContentPage.ToolbarItems>
默认情况下,辅助项分组到带有系统省略号图标 (UIImage.GetSystemImage("ellipsis.circle")) 的下拉菜单中。 当菜单打开并更改项的属性时,菜单会自动重新生成并关闭以反映更新。
XAML
源生成器
注释
下面是适用于 .NET MAUI 10 RC1 及更新版本的说明。 在 RC1 之前,启用源代码生成的方式是不同的。 请更新到 RC1,并使用以下说明。 现在可以删除为启用源生成而实现的任何其他代码。
.NET MAUI 现在包含用于 XAML 的源生成器,可提高生成性能并提供更好的工具支持。 此生成器在编译时为 XAML 文件创建强类型代码,从而减少运行时开销并提供更好的 IntelliSense 支持。
源生成器使用 [Generated] 属性修饰生成的类型,以便更好地进行工具集成和调试支持。
若要启用 XAML 源生成,请将以下属性添加到 .NET MAUI 项目的项目文件中。 请确保将其添加到您的 csproj 文件中的PropertyGroup,该PropertyGroup可以是新的或现有的。
<PropertyGroup>
<MauiXamlInflator>SourceGen</MauiXamlInflator>
</PropertyGroup>
隐式和全局 XML 命名空间
.NET 10 预览版 5 为 .NET MAUI 引入了更简洁的 XML 命名空间体验 ,可以消除几乎所有用在每个 XAML 文件顶部复制粘贴的模板 xmlns: 行。
| 更改内容 | 工作原理 |
|---|---|
| 项目范围的“全局”命名空间 |
http://schemas.microsoft.com/dotnet/maui/global 是一个新的 xmlns,可用于聚合多个 xmlns。 默认情况下,它包含 maui xmlns(sourcegenerated)、{YourNamespace}和 {YourNamespace}.Pages。 |
| 向后兼容 | 现有显式 xmlns: 映射仍可编译;仅当需要消除重复类型名称时,才添加它们。 |
| 隐式默认命名空间 (选择加入) | 选择加入时,编译器现在会自动注入 http://schemas.microsoft.com/dotnet/2021/maui ,因此你可以删除根 xmlns 和 xmlns:x 行。 |
之前与之后
<!-- .NET 8 style -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:MyApp.Models"
xmlns:controls="clr-namespace:MyApp.Controls"
x:Class="MyApp.MainPage">
<controls:TagView x:DataType="models:Tag" />
</ContentPage>
<!-- .NET 10 Preview 5 -->
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/maui/global"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.MainPage">
<TagView x:DataType="Tag" />
</ContentPage>
变化:
- 无需声明
xmlns:models或xmlns:controls因为它们在GlobalXmlns.cs文件中全局声明 - 不需要前缀
TagView或Tag
<!-- .NET 10 Preview 5 plus opt-in -->
<ContentPage x:Class="MyApp.MainPage">
<TagView x:DataType="Tag" />
</ContentPage>
变化:
- 无需声明
xmlns或xmlns:x将其隐式添加到全局命名空间
如何采纳
创建新项目以查看简化的体验,或使用以下详细信息升级现有项目。
-
将项目 升级到
net10.0-目标框架。 -
添加 一个程序集级文件(例如
GlobalXmlns.cs)以映射您的 CLR 命名空间。 - 请删除 XAML 中的冗余行和前缀。 IntelliSense 和热重载可继续工作 , 只需使用更简洁的标记。
<PropertyGroup>
<DefineConstants>$(DefineConstants);MauiAllowImplicitXmlnsDeclaration</DefineConstants>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
示例 GlobalXmlns.cs
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Views")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Controls")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Converters")]
如果希望继续使用 XAML 中的 xmlns 前缀,也可以为它们 GlobalXmlns.cs 提供默认前缀。
using XmlnsPrefixAttribute = Microsoft.Maui.Controls.XmlnsPrefixAttribute;
[assembly: XmlnsPrefix("MyApp.Controls","controls")]
像以前一样使用它们。
<ContentPage x:Class="MyApp.MainPage">
<controls:TagView x:DataType="Tag" />
</ContentPage>
✨ 提示: 也可以在此处注册第三方库!
XAML 标记扩展
已弃用 FontImageExtension XAML 标记扩展。 应改用 FontImageSource 类型:
<Button Text="Press me"
Background="Transparent"
TextColor="{AppThemeBinding Light=Black, Dark=White}"
ImageSource="{FontImageSource Glyph=MyGlyph, Color={AppThemeBinding Light=Black, Dark=White}, FontFamily=FontAwesome, Size=18}" />
为方便起见,还可以使用属性元素语法:
<Button Text="Press me"
Background="Transparent"
TextColor="{AppThemeBinding Light=Black, Dark=White}" >
<Button.ImageSource>
<FontImageSource Glyph="MyGlyph"
Color="{AppThemeBinding Light=Black, Dark=White}"
FontFamily="FontAwesome"
Size="18" />
</Button.ImageSource>
</Button>
有关详细信息,请参阅 显示字体图标。
适用于 Android 的 .NET
.NET 10 中的适用于 Android 的 .NET 增加了对 API 36 和 JDK 21 的支持,并包括减少生成时间并提高性能的工作。 有关 .NET 10 中适用于 Android 的 .NET 的详细信息,请参阅以下发行说明:
- 适用于 Android 10 的 .NET 候选版本 1
- .NET Android 10 预览版 7
- 适用于 Android 10 预览版 6 的 .NET
- 适用于 Android 10 预览版 5 的 .NET
- 适用于 Android 10 预览版 4 的 .NET
- .NET适用于Android 10预览版3
- .NET for Android 10 第二预览版
- .NET for Android 10 预览版 1
(实验性)CoreCLR
使 Android 应用能够在 CoreCLR 运行时(而不是 Mono)上运行。 若要使用它,请将以下内容添加到 Android 版本的项目文件中:
<!-- Use CoreCLR on Android -->
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
<UseMonoRuntime>false</UseMonoRuntime>
</PropertyGroup>
请在应用程序中尝试此作并报告任何问题;提交反馈时,请指出正在使用 UseMonoRuntime=false。 预期应用程序大小当前大于 Mono,并且调试和某些运行时诊断尚未完全正常运行;这些领域正在积极改进。 这是一项实验性功能,不适用于生产用途。
可以在 dotnet/android GitHub 版本中找到 Android 更改的详细列表。
Android 16(Baklava)beta 3 绑定配置
Google 发布了 Android 16 (API 36) SDK 的 Beta 3 。 虽然仍然被归类为预览版,但ABIs已宣布稳定,谷歌预计今年夏天最终发布Android 16。
API 36 现在是 .NET 10 的默认设置,这意味着当 $(TargetFramework) 生成属性设置为 net10.0-android 时,将使用 API 36。
使用.NET 10的Visual Studio和Visual Studio Code时会出现问题,因为它们还不知道API 36,这将触发一个XA5207错误。 为了修复此问题,您需要手动将 API36 platform.jar 安装到您的 Android SDK 目录中,或者等待 Visual Studio 的即将发布的更新。
建议的最低支持的 Android API
.NET for Android 项目模板已更新,将默认 $(SupportedOSPlatformVersion) 从 21(Lollipop)更改为 24(Nougat)。 这可以防止在使用 Java 默认接口方法时遇到 "desugaring" 运行时崩溃。
虽然 .NET 10 中仍支持 API 21,但建议将现有项目更新为 API 24,以避免意外的运行时错误。
dotnet run 支持
以前,Android 项目的 .NET 不支持 dotnet run 命令,因为它不接受指定要使用的 Android 设备或模拟器所需的参数。
在 .NET 10 中,可以使用 dotnet run 命令运行适用于 Android 项目的 .NET:
// Run on the only attached Android physical device
dotnet run -p:AdbTarget=-d
// Run on the only running Android emulator
dotnet run -p:AdbTarget=-e
// Run on the specified Android physical device or emulator
dotnet run -p:AdbTarget="-s emulator-5554"
$(AdbTarget) 属性传递给 adb。 有关详细信息,请参阅 developer.android.com 上的 执行 shell 命令。
编组方法默认启用
在 .NET 9 中,引入了一种新的方式来创建 Java 代码调用 C# 代码所需的封送方法,提高了启动性能。 但是,在 .NET 9 中,它们默认处于关闭状态。
在 .NET 10 中,默认启用它们。 这些封送方法的问题通常表现为启动时挂起。 如果您在 .NET 10 预览版中遇到启动时的卡顿问题,而在 .NET 9 上没有,请尝试在项目文件中将 $(AndroidEnableMarshalMethods) MSBuild 属性设置为 false 来禁用封送方法。
<PropertyGroup>
<AndroidEnableMarshalMethods>false</AndroidEnableMarshalMethods>
<PropertyGroup>
如果修复了挂起,请提交 故障报告。
ArtifactFilename
@(AndroidMavenLibrary) 项目的元数据
@(AndroidMavenLibrary) 已添加到 .NET 9 中,并允许从 Maven 自动下载 Java 库进行绑定。 通常,此库命名为 {artifact.Id}-{artifact.Version}.[jar|aar]。 但是,这不符合标准,可以任意不同。
在 .NET 10 中,可以将 ArtifactFilename 元数据添加到 @(AndroidMavenLibrary) MSBuild 项,以允许备用文件名:
<ItemGroup>
<AndroidMavenLibrary Include="com.facebook.react:react-android" Version="0.76.0" ArtifactFilename="react-android-0.76.0-release.aar" />
</ItemGroup>
System.IO.Compression 用于创建 .apk 文件
历史上,dotnet/android-libzipsharp 被用于处理 ZIP 压缩文件,并创建 .aab 和 .apk 文件。
在 .NET 10 中:
- 对于命令行
dotnet build调用,ZipArchive用于创建.aab和.apk文件。 这将会缩短构建时间。 - 对于 Visual Studio 构建,仍然使用 dotnet/android-libzipsharp,因为无法使用System.IO.Compression的 .NET Framework 版本。
Visual Studio 在设计时生成时不再调用 aapt2
为了加快设计时生成速度,不再调用 aapt2。 而是直接分析 .aar 文件和基础 Android 资源。 这可以将某些单元测试的设计时构建时间从超过2秒缩短到不足600毫秒。
使用 JDK 21 构建
现在可以使用 JDK 21 生成适用于 Android 项目的 .NET。
generator 输出避免了可能的 System.Reflection.Emit 使用
通过从“Java 调用 C#”代码路径中删除可能命中 System.Reflection.Emit 的代码路径,从而优化了应用启动和整体性能。
ApplicationAttribute.ManageSpaceActivity 不再抛出 InvalidCastException
设置 ApplicationAttribute.ManageSpaceActivity 属性不会导致 .NET 10 中出现XAGJS7007错误。
适用于 iOS 的 .NET
iOS、tvOS、Mac Catalyst 和 macOS 上的 .NET 10 支持以下平台版本:
- iOS:18.2
- tvOS:18.2
- Mac Catalyst:18.2
- macOS:15.2
预览版 7 包括针对 .NET 9 的 Xcode 26 Beta 4 支持。 我们将在后续版本中包括 .NET 10 版本的构建。 若要使用这些新绑定,请在目标中包含 net9.0-ios26 和/或 net9.0-maccatalyst26,并将 <NoWarn>$(NoWarn);XCODE_26_0_PREVIEW</NoWarn> 包含在您的项目文件中。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-ios26</TargetFramework>
<NoWarn>$(NoWarn);XCODE_26_0_PREVIEW</NoWarn>
<!-- rest of your configuration -->
</PropertyGroup>
</Project>
注意 以前,.NET MAUI
Shell存在阻止它在 iOS 26 上呈现的问题。 已针对 .NET MAUI 9 服务版本 11 和 .NET MAUI 10 RC1 修复此问题。
有关 iOS、tvOS、Mac Catalyst 和 macOS 上的 .NET 10 的详细信息,请参阅以下发行说明:
- .NET 10.0.1xx 候选版本 1
- .NET 10.0.1xx 预览版 7
- .NET 10.0.1xx 预览版 6
- .NET 10.0.1xx 预览版 5
- .NET 10.0.1xx 预览版 4
- .NET 10.0.1xx 预览版 3
- .NET 10.0.1xx 预览版 2
- .NET 10.0.1xx 预览版 1
有关已知问题的信息,请参阅 .NET 10 中的已知问题。
修剪器在更多配置中启用
修剪器现已在以下配置中启用:
- iOS Simulator/arm64(所有配置)
- tvOS Simulator/arm64(所有配置)
- Mac Catalyst/arm64(所有配置)
默认情况下启用修剪器警告
修剪器警告先前被抑制,因为基类库会生成修剪器警告,这意味着您无法修复所有修剪器警告。 但是,在 .NET 9 中,所有 iOS 剪裁器警告都已修复,因此,默认情况下会启用剪裁器警告。 若要禁用修剪器警告,请将 $(SuppressTrimAnalysisWarnings) MSBuild 属性在项目文件中设置为 true。
<PropertyGroup>
<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
</PropertyGroup>
在库中整合原始资源
库项目可以具有不同类型的捆绑资源,例如情节提要、xibs、属性列表、图像、CoreML 模型和纹理图集,它们作为嵌入资源捆绑到编译的库中。
在嵌入之前处理这些资源(例如编译故事板或 xib 文件,或者优化属性列表和图像),但这会使库的构建过程复杂化,因为处理:
- 需要在 Mac 上运行,因为编译情节提要/xibs 只能在 Mac 上完成。
- 需要苹果的工具链。
- 生成应用时,无法基于原始资源执行决策。
在 .NET 9 中,添加了对嵌入原始资源的默认启用支持,而在 .NET 10 中,这一功能现在已改为默认禁用。 若要选择退出此行为,请将 $(BundleOriginalResources) MSBuild 属性设置为项目文件中 false:
<PropertyGroup>
<BundleOriginalResources>false</BundleOriginalResources>
</PropertyGroup>
在Windows上构建绑定项目
绑定项目现在完全在 Windows 上构建,因此不需要远程 Mac。 这使得在 Windows 上构建绑定项目的速度显著提高。
NSUrlSessionHandler 不再为会话设置 TLS 支持的最低协议版本。
以前,NSUrlSessionHandler 会从 NSUrlSessionConfiguration.TLSMinimumSupportedProtocol 属性初始化 ServicePointManager.SecurityProtocol 值,但 ServicePointManager 类现在已被弃用。 因此,您需要在创建NSUrlSessionConfiguration.TLSMinimumSupportedProtocol之前设置NSUrlSessionHandler的值。
var sessionConfiguration = NSUrlSessionConfiguration.DefaultSessionConfiguration;
sessionConfiguration.TlsMinimumSupportedProtocolVersion = TlsProtocolVersion.Tls13;
var handler = new NSUrlSessionHandler(sessionConfiguration);
NSUrlSessionHandler.BypassBackgroundSessionCheck 属性被忽略
NSUrlSessionHandler.BypassBackgroundSessionCheck 属性的存在是为了处理 Mono 运行时中的一个旧问题。 此解决方案已不再需要,因此忽略了该属性。
另请参阅
- .NET MAUI 路线图
- .NET 10 中的新增功能