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

Uno Platform 项目模板怎么选
新建 Uno Platform 项目时,unoapp 模板是唯一推荐起点,它默认包含 UWP、WinUI 3、iOS、Android、macOS 和 WebAssembly 六个目标平台。别用 unoapp-net6 或 unoapp-winui 等旧变体——它们已过时,缺少对 .NET 7+ 的完整支持,且 WebAssembly 构建会失败。
创建后检查 .csproj 中是否含 (或 net9.0),并确认 指向 5.1+。低于 5.0 的版本无法在 macOS Ventura+ 或 Android 14 上正常运行 UI 渲染。
共享 XAML 页面为什么在 WebAssembly 上空白
这是最常遇到的卡点:XAML 加载成功但内容不显示。根本原因通常是资源字典未被正确合并,或 App.xaml 中遗漏了 Application.Resources 的初始化逻辑。
- 确保
App.xaml内有结构,且所有平台共用的Styles.xaml被显式引入 - WebAssembly 不支持动态加载
ResourceDictionary的Source属性,必须用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.WriteLine 和 Console.WriteLine 重定向到平台原生日志系统,但需要手动开启输出通道。
在 App.xaml.cs 的 OnLaunched 开头加入:
#if __ANDROID__
Android.Util.Log.Info("App", "Android log enabled");
#elif __IOS__
Foundation.NSLog("iOS log enabled");
#endif
然后用 adb logcat 或 Xcode Console 查看对应 tag;WebAssembly 则必须用 Uno.UI.RuntimeTests.Logging.Logger 替代原生 Debug 类,否则日志完全丢失。
真机调试时,iOS 的 NSAppTransportSecurity 和 Android 的 android:usesCleartextTraffic="true" 容易被忽略,导致网络请求无报错却收不到响应——这不是 Uno 的问题,但新手常在这里耗半天。










