原生Xamarin项目迁移咨询:含Xamarin.Forms代码应转至哪个.NET平台?
Xamarin项目迁移方案指导
平台选择判断
先明确项目核心依赖,再决定迁移方向:
- 如果仅零散使用Xamarin.Forms,核心是原生Xamarin.iOS/Xamarin.Android代码:优先迁移到.NET for Android/.NET for iOS(.NET 6+原生平台),迁移成本更低,API兼容性高。
- 如果大量依赖Xamarin.Forms做UI开发:必须迁移到MAUI,因为Xamarin.Forms已停止维护,MAUI是官方继任者,只有它能获得长期支持。
方案一:迁移到.NET for Android/.NET for iOS(原生平台)
步骤1:升级共享类项目
打开共享类项目的.csproj文件,修改目标框架为.NET 6+(推荐LTS版本):
<TargetFramework>net6.0</TargetFramework>
移除旧的Xamarin相关NuGet包,替换Xamarin.Forms零散引用:
- 若使用
MessagingCenter,替换为CommunityToolkit.Mvvm的IMessenger; - 若使用Forms工具类,直接重构为原生平台等价实现;
- 保留业务逻辑、ViewModel等非UI代码。
步骤2:创建新的原生平台项目
在Visual Studio中创建:
- Android端:选择「Android App (.NET)」模板
- iOS端:选择「iOS App (.NET)」模板
步骤3:迁移平台专属代码
- iOS端:
复制原Xamarin.iOS代码文件到新项目,替换NuGet引用:移除Xamarin.iOS、Xamarin.Forms.iOS,添加Microsoft.iOS。大部分UIKit、Foundation等命名空间API完全兼容,直接使用即可。 - Android端:
复制原Xamarin.Android代码文件到新项目,替换NuGet引用:移除Xamarin.Android、Xamarin.Forms.Android,添加Microsoft.Android。Android.App、Android.Widget等命名空间API基本无变化。
步骤4:处理依赖与错误
- 第三方NuGet包需替换为支持.NET 6+的版本;
- 遇到Xamarin.Forms相关编译错误:要么替换为原生UI实现(比如用
UIViewController替代ContentPage,用UIStackView替代StackLayout),要么删除无用的Forms引用。
方案二:迁移到MAUI(适合大量Xamarin.Forms场景)
步骤1:预处理原项目
先将原Xamarin.Forms项目升级到最新稳定版(Xamarin.Forms 5.x),确保项目能正常编译运行,修复现有bug。
步骤2:创建MAUI项目
在Visual Studio中选择「.NET MAUI App」模板创建新项目。
步骤3:迁移共享与Forms代码
- 复制原共享类项目的业务逻辑、ViewModel到MAUI项目的共享代码区,或升级原共享类到.NET 6+后作为类库引用;
- 复制Xamarin.Forms的XAML页面、代码-behind到MAUI项目的
Pages文件夹,修改XAML命名空间:<!-- 替换原Forms命名空间 --> xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" - 调整
App类继承:从Xamarin.Forms.Application改为Microsoft.Maui.Controls.Application;在MauiProgram.cs中配置MainPage。
步骤4:迁移平台专属代码
- 原Xamarin自定义渲染器替换为MAUI的Handlers;
- 平台特定初始化代码(如权限、第三方SDK配置)迁移到MAUI的
Platforms/Android、Platforms/iOS对应文件中(如MainActivity.cs、AppDelegate.cs)。
步骤5:更新依赖与调试
- 移除所有Xamarin相关NuGet包,替换为
Microsoft.Maui.Controls、Microsoft.Maui.Essentials等MAUI官方包; - 第三方包需替换为支持MAUI的版本;
- 编译调试,处理过时API替换、平台配置调整等问题(如Android权限申请、iOS Info.plist配置)。
关于复制代码到.NET for iOS出错的解决
.NET for iOS是纯原生平台项目,不支持Xamarin.Forms的UI组件,因此代码中若包含ContentPage、StackLayout等Forms类会直接报错。解决方式:
- 若只是少量Forms引用:直接替换为iOS原生UIKit实现;
- 若大量依赖Forms:放弃.NET for iOS原生方案,转用MAUI迁移。
内容的提问来源于stack exchange,提问作者Eric Bowerbank
相关产品推荐
相关产品推荐

