C# Uno Platform入门方法 C#如何使用Uno Platform构建跨所有平台的应用

21次阅读

新建Uno Platform项目应选unoapp模板,它支持六平台且适配.NET 8+/9+与Uno 5.1+;共享XAML在WebAssembly空白主因资源字典未静态合并;C#跨平台需避开平台专属API,用抽象接口替代;android/ios日志需手动启用并配合对应工具查看。

C# Uno Platform入门方法 C#如何使用Uno Platform构建跨所有平台的应用

Uno Platform 项目模板怎么选

新建 Uno Platform 项目时,unoapp 模板是唯一推荐起点,它默认包含 UWP、winui 3、iOS、Android、macOS 和 WebAssembly 六个目标平台。别用 unoapp-net6unoapp-winui 等旧变体——它们已过时,缺少对 .NET 7+ 的完整支持,且 WebAssembly 构建会失败。

创建后检查 .csproj 中是否含 net8.0(或 net9.0),并确认 指向 5.1+。低于 5.0 的版本无法在 macOS Ventura+ 或 Android 14 上正常运行 UI 渲染。

共享 XAML 页面为什么在 WebAssembly 上空白

这是最常遇到的卡点:XAML 加载成功但内容不显示。根本原因通常是资源字典未被正确合并,或 App.xaml 中遗漏了 Application.Resources 的初始化逻辑。

  • 确保 App.xaml 内有 结构,且所有平台共用的 Styles.xaml 被显式引入
  • WebAssembly 不支持动态加载 ResourceDictionarySource 属性,必须用 x:Key + MergedDictionaries 静态合并
  • 检查浏览器控制台是否有 Failed to load resource: net::ERR_ABORTED —— 这说明某个 .xaml 文件没被 WasmHead.csproj 正确打包

如何让 C# 代码真正跨平台运行

Uno Platform 不是“写一次到处编译”,而是“写一次,按需适配”。C# 逻辑层能跨平台的前提是避开平台专属 API。

  • 禁用 System.IO.File 直接读写路径,改用 IFileService 抽象接口 + 各平台实现(Uno 自带 StorageFile 封装
  • 避免硬编码 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),改用 windows.Storage.ApplicationData.Current.LocalFolder(Uno 已桥接到所有平台)
  • 网络请求必须用 HttpClient,不要用 WebClient(WebAssembly 不支持);且需手动设置 BaseAddress,否则 iOS/Android 可能因 ATS 或 cleartext 限制静默失败

调试 Android/iOS 时 Log 输出看不到

Uno 默认把 Debug.WriteLineconsole.WriteLine 重定向到平台原生日志系统,但需要手动开启输出通道。

App.xaml.csOnLaunched 开头加入:

#if __ANDROID__     Android.Util.Log.Info("App", "Android log enabled"); #elif __IOS__     Foundation.NSLog("iOS log enabled"); #endif

然后用 adb logcatxcode Console 查看对应 tag;WebAssembly 则必须用 Uno.UI.RuntimeTests.Logging.Logger 替代原生 Debug 类,否则日志完全丢失。

真机调试时,iOS 的 NSApptransportSecurity 和 Android 的 android:usesCleartextTraffic="true" 容易被忽略,导致网络请求无报错却收不到响应——这不是 Uno 的问题,但新手常在这里耗半天。

text=ZqhQzanResources