AIGC标识 用 .NET MAUI 一套 C# 同时出 Windows 和 Android:能做到什么程度(实测交付视角)

一、这个需求你一定遇到过

做桌面端外包这几年,最常听到的一句话是:"软件挺好用,就是我出门的时候想用手机看一眼数据。"

客户的 WPF / WinForms 系统已经稳定跑了几年,推倒重写不现实,单独再找一拨人写 Android 原生,成本翻倍、两套代码以后没法一起维护。.NET MAUI 就是给这种场景准备的:用你已经会的 C#,一套代码库同时产出 Windows 桌面程序和 Android APP

这篇文章不吹"一次编写到处运行"的口号,只讲三件事:哪些东西真的能共享、哪些地方必须分平台写、从写完到能装到客户手机上中间还有多远。

二、工程结构:单项目多目标框架

MAUI 的项目文件允许多个 TargetFramework,这是"一套代码"的技术基础:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net8.0-android;net8.0-windows10.0.19041.0</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <UseMaui>true</UseMaui>
    <SingleProject>true</SingleProject>
  </PropertyGroup>
</Project>

平台差异代码用条件编译隔离,编译时只保留当前目标平台的分支:

#if ANDROID
    // Android 特有逻辑,例如读取设备标识
#elif WINDOWS
    // Windows 特有逻辑,例如注册文件关联
#endif

MVVM 层用 CommunityToolkit.Mvvm,ViewModel 可以做到 100% 平台无关——这恰恰是从 WPF 迁移过来最舒服的部分,因为你本来就在写 MVVM。

三、真正能共享的是什么

按我实际的交付经验,分层看共享比例:

共享程度 说明
业务逻辑 / 领域模型 ≈100% 纯 C# 类库,两端原样复用
数据访问(SQLite / REST 客户端) ≈100% sqlite-net-pclHttpClient 两端通用
ViewModel + 校验规则 ≈100% 和 WPF 的 MVVM 写法几乎一致
XAML 页面 70–85% 布局能共享,但要按屏幕尺寸做响应式调整
平台能力(推送、扫码、文件、权限) 0–30% 必须分平台写,或用 MAUI Essential API 兜底

几个两端直接能用的 API,写法确实省心:

// 记住登录状态:Android 落 KeyStore/EncryptedSharedPreferences,Windows 落 DPAPI,调用方无感
await SecureStorage.SetAsync("token", token);

// 网络状态判断,断网缓存上传数据的场景必用
var access = Connectivity.Current.NetworkAccess;

// 轻量配置
Preferences.Set("last_sync_at", DateTime.Now.ToString("O"));

也就是说:共享的是逻辑和骨架,不是像素。UI 在 Android 上渲染的是原生控件、在 Windows 上渲染的是 WinUI 3 控件,同一份 XAML 出来的观感天然有差异,这一点要有心理预期,也要提前和客户对齐。

四、必须说实话的三个边界

  1. Windows 端不是 WPF。MAUI 在 Windows 上走的是 WinUI 3 体系。如果客户的项目重度依赖 WPF 自定义控件或第三方 WPF 组件库,桌面端保留原 WPF、MAUI 只出 Android 端,往往比强行双端合一更省钱。
  2. 第三方库要确认 MAUI 兼容性。老的多平台库(Xamarin 时代的)不一定直接可用,动手前先列依赖清单逐一确认,这一步能避免一半的坑。
  3. 本文只谈 Windows + Android。iOS 一端需要 Mac 构建机,接单评估时别漏掉这条成本。

五、从代码到装进客户手机

Android 端签名打包,先做一次密钥库(之后一直复用,丢了就无法更新应用):

keytool -genkeypair -v -keystore myapp.keystore -alias myapp
        -keyalg RSA -keysize 2048 -validity 10000

发布命令一条完成签名 APK(aab 用于商店上传,APK 用于直接分发):

dotnet publish -f net8.0-android -c Release ^
  -p:AndroidKeyStore=true ^
  -p:AndroidSigningKeyStore=myapp.keystore ^
  -p:AndroidSigningKeyAlias=myapp ^
  -p:AndroidSigningKeyPass=*** -p:AndroidSigningStorePass=***

Windows 端 dotnet publish -f net8.0-windows -c Release,按需走 MSIX 签名或免打包目录分发。

合规这条线(国内交付必做,别等商店打回才补)

  • 权限最小化:Manifest 里只声明用到的权限,相机、定位等危险权限运行时动态申请,弹窗文案要说明用途;
  • 隐私政策:APP 内可查看,首启同意前不采集任何数据;第三方 SDK(统计、推送等)逐个列入清单说明用途;
  • APP 备案:国内上架现在要求完成工信部 App 备案(一般由你的云服务商/接入商提供备案入口),周期要提前算进项目排期;
  • 软著:多数国内应用商店的独立开发者认证会用到,建议随项目一起办。

后端侧如果是新配的服务,我直接上 ASP.NET Core WebAPI:JWT 鉴权 + HTTPS,一个后端同时伺候 WPF 老客户端和新的 APP,接口按 /api/v1/ 版本化,老桌面端平滑过渡。

六、接单视角:什么时候选 MAUI

适合:客户已有 .NET 桌面系统、需求是表单 + 列表 + 数据采集 + 扫码这类"业务型"APP、预算有限又要双端。
不适合:重动画/游戏的交互、强依赖某平台原生 SDK 的需求、还要出 iOS 又没有 Mac 的情况。

一句话总结:MAUI 不是魔法,它是给 "C# 团队 + 业务型应用 + 预算要省" 这个组合准备的正经答案。评估时把"能共享 80% 逻辑、要重做 20% 界面、合规流程 2–4 周"这三句话说给客户听,项目就成功了一半。


我是独立开发者,主力 .NET 桌面端(WPF/WinForms),微信小程序、手机 APP(MAUI/uni-app)与配套 .NET WebAPI 后端都在接。有项目欢迎直接联系:

手机 17788568694 | 微信 17788568694(与手机同号)| QQ 76656825

posted @ 2026-09-19 19:08  桌面开发杨工  阅读(3)  评论(0)    收藏  举报