C# / .NET 跨平台运行调研
C# 的 .NET Core(以及现在统一后的 .NET)可以运行在 macOS 和 Linux 上,而且是官方支持的跨平台运行环境。
---
✅ .NET / .NET Core 的跨平台支持
支持的操作系统
.NET Core(从 .NET 5 起统一称为 .NET)原生支持以下系统:- ✅ Windows
- ✅ macOS
- ✅ Linux(Ubuntu、Debian、CentOS、Alpine、RHEL 等)
---
✅ 可运行的应用类型
在 macOS / Linux 上可以运行:
✔ 控制台应用
dotnet run
dotnet myapp.dll
✔ Web 应用(ASP.NET Core)
- Web API
- MVC
- Razor Pages
- Minimal API
✔ 后台服务 / 微服务
- Docker 容器
- Kubernetes
- systemd 服务(Linux)
- launchd(macOS)
✔ 工具类程序
- CLI 工具
- 自动化脚本
❌ 不完全支持或不支持的情况
| 技术 | macOS / Linux |
|---|---|
| WinForms | ❌ 仅 Windows |
| WPF | ❌ 仅 Windows |
| UWP / WinUI | ❌ 仅 Windows |
| COM / Registry / Windows API | ❌ |
- .NET MAUI(跨平台桌面 + 移动)
- Avalonia UI
- Uno Platform
✅ 在 macOS / Linux 上的开发体验
安装 .NET SDK
# macOS (brew)
brew install dotnet
# Ubuntu
sudo apt install dotnet-sdk-8.0
常用开发工具
- VS Code + C# Dev Kit
- JetBrains Rider
- Visual Studio for Mac(⚠ 已停止维护,不推荐)
✅ 示例:跨平台运行
dotnet new webapi -n MyApi
cd MyApi
dotnet run
同一项目:
- Windows ✅
- macOS ✅
- Linux ✅
- Docker ✅
✅ 总结一句话
> C# 的 .NET Core / .NET 是官方支持的跨平台框架,可在 macOS 和 Linux 上稳定运行,尤其适合 Web、API、微服务和云原生应用。
---
下面我从 定位、技术架构、跨平台能力、学习成本、适用场景 等方面,系统性地介绍 Avalonia UI 和 Uno Platform,并在最后给出选型建议,方便快速决策。
---
一、Avalonia UI
✅ 基本介绍
Avalonia UI 是一个 跨平台桌面 UI 框架,专注于 Windows / macOS / Linux,语法和思想高度接近 WPF。> ✅ 如果你会 WPF,几乎可以“无痛迁移”
---
✅ 支持的平台
| 平台 | 支持 |
|---|---|
| Windows | ✅ |
| macOS | ✅ |
| Linux | ✅ |
| 浏览器(WebAssembly) | ✅(实验/逐步完善) |
| Android / iOS | ⚠ 有社区方案,不是主力 |
✅ 技术特点
1️⃣ XAML + MVVM
- 使用 XAML
- 原生支持 MVVM
- DataBinding、Command、Styles、Templates 都很成熟
<TextBlock Text="{Binding Title}" />
<Button Content="Click" Command="{Binding SaveCommand}" />
---
2️⃣ 自绘引擎(跨平台一致性)
- 不依赖系统原生控件
- 使用 Skia / Direct2D 渲染
- UI 在所有平台外观一致 ✅
---
3️⃣ WPF 开发者非常友好
- 类似:
- DependencyProperty
- ControlTemplate
- ResourceDictionary
- 可以迁移大量 WPF 思想和代码
✅ 优点 & 缺点
✅ 优点
- ✅ 学习成本低(WPF 开发者)
- ✅ 桌面端体验好
- ✅ 开源、社区活跃
- ✅ Linux 支持非常好
❌ 缺点
- ❌ 移动端支持弱
- ❌ Web 端仍在完善
- ❌ 商业控件生态不如 WPF / Uno
✅ 适合场景
- 桌面软件(跨平台)
- 工具类 / IDE / 管理软件
- 从 WPF 迁移到跨平台
二、Uno Platform
✅ 基本介绍
Uno Platform 是一个 “一次编写,多端运行” 的 UI 平台,以 WinUI / UWP 为核心模型。> ✅ 如果你熟悉 UWP / WinUI / Windows App SDK,非常适合
---
✅ 支持的平台
| 平台 | 支持 |
|---|---|
| Windows (WinUI) | ✅ |
| macOS | ✅ |
| Linux | ✅ |
| iOS | ✅ |
| Android | ✅ |
| WebAssembly | ✅ |
---
✅ 技术特点
1️⃣ WinUI / UWP API
- 使用 XAML(WinUI 风格)
- API 和 Windows 平台高度一致
<Button Content="Save"
Command="{Binding SaveCommand}" />
---
2️⃣ 原生控件(非自绘)
- iOS → UIKit
- Android → Android Views
- Web → HTML / CSS
- Desktop → Skia / native
---
3️⃣ 与微软生态高度兼容
- 支持:
- WinUI 3
- Windows App SDK
- Windows API(部分)
✅ 优点 & 缺点
✅ 优点
- ✅ 覆盖平台最广
- ✅ UI 更接近原生体验
- ✅ 可直接复用 WinUI / UWP 代码
- ✅ 非常适合移动端 + 桌面 + Web
❌ 缺点
- ❌ 学习成本较高
- ❌ 抽象层复杂,调试难度大
- ❌ 桌面 Linux/macOS 成熟度略逊 Avalonia
✅ 适合场景
- 全平台产品(桌面 + 移动 + Web)
- 原 UWP / WinUI 项目迁移
- 企业级应用、长期产品
三、Avalonia vs Uno 对比速览
| 对比项 | Avalonia UI | Uno Platform |
|---|---|---|
| 核心定位 | 跨平台桌面 | 真 · 全平台 |
| 技术风格 | WPF | WinUI / UWP |
| UI 渲染 | 自绘 | 原生控件 |
| Linux 支持 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 移动端支持 | ⭐ | ⭐⭐⭐⭐⭐ |
| WebAssembly | ⚠ | ✅ |
| 学习成本 | 低 | 中~高 |
| 社区成熟度 | 高 | 中高 |
四、如何选择?(直接结论)
✅ 选 Avalonia UI 如果:
- 你主要做 桌面应用
- 你熟悉 WPF
- 需要 macOS / Linux 支持
- 不关心移动端
---
✅ 选 Uno Platform 如果:
- 你需要 桌面 + 手机 + Web
- 你有 UWP / WinUI 经验
- 希望 UI 更“原生”
- 项目生命周期长、规模大
---
✅ 一句话总结
> Avalonia = WPF 跨平台桌面之王 > Uno = WinUI 全平台解决方案
---
Uno Platform 在 Windows 11 上的安装体验是目前跨平台 .NET UI 框架里做得最好的之一。下面给你一套官方推荐、稳定、少踩坑的安装流程,适合 Win 11 + 新项目。
> ✅ 以下步骤适用于 2026 年初、Uno Platform 5.x + .NET 9 的主流组合
---
一、整体安装流程概览(先看这个)
在 Windows 11 上安装 Uno Platform,推荐顺序是:
1. ✅ 安装 Visual Studio 2022 2. ✅ 安装 .NET SDK(8 / 9) 3. ✅ 安装 Uno Platform 扩展 4. ✅ 运行 uno-check(关键步骤) 5. ✅ 创建并运行第一个 Uno 项目
---
二、步骤 1:安装 Visual Studio 2022(必选)
✅ 推荐版本
- Visual Studio 2022
- 版本要求:17.12 或以上(支持 .NET 9)
✅ 必选工作负载(非常重要)
在 VS Installer 中勾选:✅ .NET 桌面开发 ✅ 使用 .NET 的移动开发 ✅ ASP.NET 和 Web 开发
> Uno 会用到桌面、WebAssembly、Android/iOS 的工具链
📌 Android / iOS 即使暂时不用,也建议先装,后面省事
官方说明:Visual Studio 与 .NET 版本对应关系 (learn.microsoft.com)
---
三、步骤 2:安装 .NET SDK
✅ 推荐安装
- .NET 8(LTS)
- .NET 9(Current)
> Uno Platform 当前模板和 Skia Desktop / WASM 都已支持 .NET 9 (platform.uno)
---
四、步骤 3:安装 Uno Platform 扩展
在 Visual Studio 中:
1. 打开 Extensions → Manage Extensions 2. 搜索 Uno Platform 3. 安装:- ✅ Uno Platform
这一步会提供:
- 项目模板
- XAML 编辑支持
- 平台配置向导
---
五、步骤 4:运行 uno-check(⚠️ 最关键)
> uno-check 是 Uno Platform 的“环境医生” > 会自动检测并安装你缺失的 SDK、工具、模拟器
✅ 安装 uno-check
dotnet tool install -g uno.check
或更新:
dotnet tool update -g uno.check
✅ 运行检查
uno-check
你会看到类似:
- ✅ .NET SDK
- ✅ Visual Studio Workloads
- ❌ Android SDK(可自动修复)
- ❌ WebAssembly Tools
Y 让它自动修复即可官方文档 (platform.uno)
---
六、步骤 5:创建你的第一个 Uno 项目(推荐方式)
✅ 方式一:Visual Studio(最简单)
1. Create a new project
2. 搜索:Uno Platform App
3. 选择 Recommended
4. 选择平台(建议):
- ✅ Skia Desktop(Windows / Linux / macOS)
- ✅ WebAssembly
- ✅ Windows App SDK
---
✅ 方式二:命令行(更灵活)
dotnet new unoapp -n MyUnoApp
cd MyUnoApp
dotnet run -f net9.0-desktop
模板说明 (platform.uno)
---
七、你现在已经能做什么?
✅ 在 Windows 11 上运行 Uno 应用 ✅ 同一项目可运行:
- Windows(WinUI / Skia)
- Linux / macOS(Skia)
- Web(WebAssembly)
- Android / iOS(后续)
- XAML
- MVVM
- WinUI API
- CommunityToolkit
八、常见新手建议(少踩坑)
✅ 先从 Skia Desktop + Windows 开始 ✅ 不要一开始就全平台编译 ✅ uno-check 报错一定要修完再写代码 ✅ 升级 Uno / .NET 用 global.json 控制
---
✅ 一句话总结
> 在 Windows 11 上安装 Uno Platform 的正确姿势是: Visual Studio + .NET SDK + Uno 扩展 + uno-check,一次到位。
---
--- Learn more: 1. Install .NET on Windows - .NET | Microsoft Learn 2. Supported platforms 3. Quick Start 4. Setup your environment with uno-check 5. The Uno Platform Solution Template
> 完全可以用 C# / .NET 做跨平台网络服务器, 而且不需要 IIS,也不必使用 ASP.NET。
下面我按 “通信模型” 来系统介绍 主流、成熟、开源 的选择,并附上适用场景 + 选型建议。
---
一、最底层:Socket / 网络基础(完全不依赖 Web)
> ✅ 最自由、性能最高 > ❌ 需要你自己处理协议、并发、心跳、断线
---
1️⃣ System.Net.Sockets(官方)
✅ 特点
- .NET 内置
- TCP / UDP / Unix Socket
- 真 · 跨平台(Win / Linux / macOS)
✅ 适合
- 自定义协议
- 游戏服务器
- IoT / 设备通信
- 高性能长连接
✅ 示例
var listener = new TcpListener(IPAddress.Any, 9000);
listener.Start();
while (true)
{
var client = await listener.AcceptTcpClientAsync();
_ = Task.Run(() => Handle(client));
}
✅ 优点:零依赖 ❌ 缺点:你要造很多轮子
---
2️⃣ DotNetty(Netty 的 .NET 版本)
📌 非常值得推荐
✅ 特点
- 事件驱动
- 高性能
- Pipeline / Channel 模型
- TCP / UDP / WebSocket
- 广泛用于游戏 / IM / 中间件
✅ 项目
- GitHub:Azure/DotNetty
- Apache Netty 的 .NET 移植
✅ 适合
- 高并发长连接
- 游戏服务器
- 自定义协议服务端
二、中间层:RPC / 消息通信(不走 HTTP)
---
3️⃣ gRPC(不等于 ASP.NET)
> ⚠️ 很多人误解:gRPC ≠ ASP.NET
✅ 特点
- HTTP/2 + Protobuf
- 强类型
- 高性能
- 多语言互通
✅ 实现方式
- ✅ Grpc.Core(原生)
- ✅ gRPC over Kestrel(可不使用 IIS)
✅ 适合
- 微服务
- 内部服务通信
- 跨语言系统
4️⃣ MagicOnion(强烈推荐)
📌 gRPC + C# 极致体验
✅ 特点
- 基于 gRPC
- 像写接口一样写 RPC
- 支持 Streaming / 双向流
- Unity / 游戏后端常用
✅ 示例
public interface IChatService : IService<IChatService>
{
UnaryResult<string> HelloAsync(string name);
}
✅ 非 Web ✅ 高性能 ✅ 跨平台
---
三、消息 / Actor 模型(服务器架构级)
---
5️⃣ Akka.NET
✅ 特点
- Actor 模型
- 分布式
- 容错 / 监督树
- 消息驱动
✅ 适合
- 状态复杂的服务器
- 分布式系统
- 游戏 / 金融 / IoT
---
6️⃣ Orleans(Virtual Actor)
✅ 特点
- Actor 抽象
- 自动分布式
- 无需关心节点
✅ 适合
- 云原生
- 状态服务
- MMO / 实时系统
---
四、轻量级 HTTP / TCP Server(不算 ASP.NET)
---
7️⃣ Kestrel(独立使用)
> ✅ ASP.NET Core 的 Web Server > ❌ 你不需要用 ASP.NET
✅ 特点
- 高性能
- 可裸用
- HTTP / WebSocket
var host = Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(web =>
{
web.UseKestrel();
web.Configure(app =>
{
app.Run(async ctx =>
{
await ctx.Response.WriteAsync("Hello");
});
});
})
.Build();
await host.RunAsync();
✅ 不依赖 IIS ✅ Linux / Docker 常用
---
五、专门领域框架
---
8️⃣ SuperSocket
✅ 特点
- TCP / UDP / WebSocket
- 插件式协议解析
- 很适合自定义协议
✅ 适合
- 设备接入
- 游戏服务端
- 长连接通信
9️⃣ Bedrock Framework(微软)
✅ 特点
- System.IO.Pipelines
- 高性能网络抽象
- 用于基础设施
---
六、快速选型表(直接看这个)
| 需求 | 推荐框架 |
|---|---|
| 原始 TCP / UDP | System.Net.Sockets |
| 高并发长连接 | DotNetty |
| RPC / 微服务 | gRPC / MagicOnion |
| 游戏服务器 | DotNetty / MagicOnion / Akka.NET |
| 状态复杂系统 | Orleans / Akka.NET |
| 设备 / 协议服务器 | SuperSocket |
| HTTP 但不要 ASP.NET | Kestrel 裸用 |
七、我的直接建议(经验之谈)
如果你告诉我一句话的目标,我可以直接给你最优解:
✅ 通用推荐
- 自定义协议 / 长连接 → DotNetty
- RPC / 内部服务 → MagicOnion
- 状态型服务器 / 分布式 → Orleans
✅ 一句话总结
> C# / .NET 不依赖 IIS、不使用 ASP.NET, 依然可以构建高性能、跨平台、生产级服务器程序。
---
一、一句话先给结论(给忙的人)
> Orleans = 为云和业务而生的“分布式状态抽象” > Akka.NET = 为并发与控制而生的“通用 Actor 系统”
如果你记住这句话,后面所有差异都会变得合理。
---
二、设计哲学(这是根本差异)
Orleans:Virtual Actor(“假装没有服务器”)
核心思想
> Actor 永远存在,不关心它在哪个节点- 不需要你管理:
- Actor 生命周期
- Actor 分布
- Actor 激活 / 迁移
- 你只关心:业务逻辑 + 状态
---
Akka.NET:Actor Model(“你在控制一个系统”)
核心思想
> 你明确知道 Actor 在哪、怎么活、怎么死- 你要关心:
- Actor 创建 / 停止
- Actor 层级(父子)
- Actor 监督策略
- 分布式是显式能力
---
✅ 第一性结论
| 问题 | Orleans | Akka.NET |
|---|---|---|
| 目标 | 简化分布式业务 | 控制复杂并发系统 |
| 抽象层级 | 非常高 | 非常低 |
| 心智负担 | 小 | 大 |
三、编程模型对比(写代码的感觉)
---
1️⃣ Actor 定义方式
Orleans(接口即 Actor)
public interface IUserGrain : IGrainWithStringKey
{
Task AddScore(int value);
Task<int> GetScore();
}
public class UserGrain : Grain, IUserGrain
{
private int _score;
public Task AddScore(int value)
{
_score += value;
return Task.CompletedTask;
}
}
✅ 像写普通业务类 ✅ 没有消息类型 ✅ 没有 Receive / Context
---
Akka.NET(显式消息)
public record AddScore(int Value);
public record GetScore();
public class UserActor : ReceiveActor
{
private int _score;
public UserActor()
{
Receive<AddScore>(msg => _score += msg.Value);
Receive<GetScore>(_ => Sender.Tell(_score));
}
}
✅ 显式并发模型 ✅ 消息是第一公民 ✅ 强控制力
---
✅ 编程体验结论
| Orleans | Akka.NET | |
|---|---|---|
| 写法 | 接近普通 C# | 函数式 / 消息驱动 |
| 可读性 | 高 | 中 |
| 灵活性 | 中 | 极高 |
四、状态管理(最关键差异)
---
Orleans:状态是“理所当然”的
特点
- Actor 天然有状态
- 单线程执行(无需锁)
- 状态可:
- 内存
- Redis
- SQL
- Cosmos DB
public class UserGrain : Grain<UserState>
{
public async Task AddScore(int v)
{
State.Score += v;
await WriteStateAsync();
}
}
✅ 自动序列化 ✅ 自动恢复 ✅ 自动重试
---
Akka.NET:状态是“你要自己管的”
特点
- Actor 本身是无状态抽象
- 状态在内存
- 持久化是显式选择
public class UserActor : ReceivePersistentActor
{
public override string PersistenceId => "user-1";
private int _score;
public UserActor()
{
Command<AddScore>(cmd =>
{
Persist(cmd, e => _score += e.Value);
});
}
}
✅ Event Sourcing ✅ CQRS ❌ 成本高
---
✅ 状态模型结论
| Orleans | Akka.NET | |
|---|---|---|
| 默认状态 | ✅ | ❌ |
| 持久化 | 简单 | 复杂 |
| 事件溯源 | ❌ | ✅ |
| 业务状态 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
五、分布式与伸缩能力
---
Orleans:透明分布式
- Actor 自动分布
- 自动迁移
- 自动负载均衡
- 自动重启
var user = grainFactory.GetGrain<IUserGrain>("42");
await user.AddScore(10);
✅ 不关心:
- 在哪台机器
- 是否迁移
- 是否重启
Akka.NET:显式分布式
- Akka.Cluster
- Akka.Remote
- Akka.Sharding
ClusterSharding.Get(system).Start(
typeName: "User",
entityProps: Props.Create<UserActor>(),
settings: ClusterShardingSettings.Create(system),
extractEntityId: ...
);
✅ 极强控制 ❌ 配置复杂 ❌ 心智负担大
---
✅ 分布式结论
| Orleans | Akka.NET | |
|---|---|---|
| 自动扩缩容 | ✅ | ❌ |
| 位置透明 | ✅ | ❌ |
| 手动控制 | ❌ | ✅ |
六、容错与恢复模型
---
Orleans
- Actor 崩溃 → 自动重建
- 状态自动恢复
- 调用方无感知(大多数情况)
---
Akka.NET
- Supervision Tree
- Restart / Resume / Stop
- 明确策略
---
七、性能与延迟
延迟
- Akka.NET:更低(少一层抽象)
- Orleans:稍高(虚拟化层)
吞吐
- 两者都非常高
- Orleans 在 状态密集型 场景更稳
- Akka 在 消息风暴 / 流处理 更强
---
八、运维与部署成本(现实世界)
---
Orleans
✅ Kubernetes / 云原生 ✅ 少配置 ✅ 自动恢复 ✅ 易监控👉 适合小团队
---
Akka.NET
❌ 配置复杂 ❌ 调试难 ✅ 强可控 ✅ 高可定制👉 适合平台级团队
---
九、真实应用场景对比
---
✅ Orleans 最适合
- 游戏服务器(角色 / 房间 / 匹配)
- IoT 设备管理
- 用户会话 / 状态服务
- 实时业务系统
- SaaS 后端
---
✅ Akka.NET 最适合
- 分布式计算引擎
- 金融交易系统
- 实时流处理
- 自定义调度系统
- 中间件 / 基础设施
---
十、最终选型决策表(非常实用)
| 问题 | 选谁 |
|---|---|
| 我要快速做一个分布式服务 | Orleans |
| 我的系统状态非常复杂 | Orleans |
| 我需要 Event Sourcing | Akka.NET |
| 我需要精细控制 Actor 生命周期 | Akka.NET |
| 小团队 / 快上线 | Orleans |
| 架构团队 / 平台级 | Akka.NET |
✅ 最终一句话总结
> Orleans 是“为业务服务的分布式状态引擎” > Akka.NET 是“为工程师服务的并发与分布式工具箱”
---
一、聊天室业务需求(统一定义)
我们先定义完全一样的业务语义,否则对比没有意义。
✅ 聊天室需求
- 多个聊天室(Room)
- 多个用户(User)
- 用户可:
- 加入房间
- 发送消息
- 离开房间
- 房间负责:
- 维护在线用户
- 广播消息
二、Orleans 方案(Virtual Actor 思维)
---
1️⃣ Orleans Grain 设计(核心)
Grain 职责拆分(非常重要)
| Grain | Key | 职责 |
|---|---|---|
ChatRoomGrain | RoomId | 房间状态、广播 |
UserGrain | UserId | 用户状态、回调 |
IChatClient | Observer | 推送消息 |
---
2️⃣ Grain 接口定义
IChatRoomGrain
public interface IChatRoomGrain : IGrainWithStringKey
{
Task Join(string userId);
Task Leave(string userId);
Task SendMessage(string userId, string message);
}
---
IUserGrain
public interface IUserGrain : IGrainWithStringKey
{
Task ReceiveMessage(string roomId, string userId, string message);
}
---
3️⃣ ChatRoomGrain 实现
public class ChatRoomGrain : Grain
{
private readonly HashSet<string> _users = new();
public async Task Join(string userId)
{
_users.Add(userId);
await Broadcast("System", $"{userId} joined the room");
}
public async Task Leave(string userId)
{
_users.Remove(userId);
await Broadcast("System", $"{userId} left the room");
}
public async Task SendMessage(string userId, string message)
{
await Broadcast(userId, message);
}
private async Task Broadcast(string from, string message)
{
foreach (var userId in _users)
{
var user = GrainFactory.GetGrain<IUserGrain>(userId);
await user.ReceiveMessage(this.GetPrimaryKeyString(), from, message);
}
}
}
✅ 单线程 ✅ 无锁 ✅ 不关心分布式
---
4️⃣ UserGrain(客户端桥梁)
public class UserGrain : Grain, IUserGrain
{
public Task ReceiveMessage(string roomId, string userId, string message)
{
Console.WriteLine($"[{roomId}] {userId}: {message}");
return Task.CompletedTask;
}
}
---
✅ Orleans 实现特点总结
- 没有任何并发控制代码
- 没有节点 / 进程概念
- Grain = 房间 / 用户
- 天然支持分布式、扩容、恢复
三、Akka.NET 方案(Actor 模型)
---
1️⃣ Actor 设计
| Actor | 职责 |
|---|---|
ChatRoomActor | 房间 |
UserActor | 用户 |
ChatSystemActor | 路由 / 管理 |
---
2️⃣ 消息定义(显式)
public record Join(string UserId);
public record Leave(string UserId);
public record Chat(string UserId, string Message);
public record Deliver(string RoomId, string From, string Message);
---
3️⃣ ChatRoomActor
public class ChatRoomActor : ReceiveActor
{
private readonly HashSet<IActorRef> _users = new();
public ChatRoomActor()
{
Receive<Join>(msg => _users.Add(Sender));
Receive<Leave>(msg => _users.Remove(Sender));
Receive<Chat>(msg =>
{
foreach (var user in _users)
{
user.Tell(new Deliver(Self.Path.Name, msg.UserId, msg.Message));
}
});
}
}
---
4️⃣ UserActor
public class UserActor : ReceiveActor
{
public UserActor()
{
Receive<Deliver>(msg =>
{
Console.WriteLine($"[{msg.RoomId}] {msg.From}: {msg.Message}");
});
}
}
---
✅ Akka.NET 实现特点总结
- 显式消息
- 显式 ActorRef
- 生命周期你负责
- 分布式要额外配置(Cluster / Sharding)
四、核心差异直观对比(聊天室角度)
| 维度 | Orleans | Akka.NET |
|---|---|---|
| 房间表示 | ChatRoomGrain | ChatRoomActor |
| 用户定位 | GetGrain(userId) | ActorRef |
| 并发 | 自动串行 | Actor Mailbox |
| 分布式 | 透明 | 显式 |
| 扩容 | 自动 | 手动 |
| 心智负担 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
五、生产级 Orleans Grain 模型设计(重点)
> 下面这个模型,可以直接用于真实项目
---
✅ 推荐 Grain 拆分
ChatRoomGrain (RoomId)
├─ State: OnlineUsers
├─ Broadcast logic
└─ No client state
UserSessionGrain (SessionId)
├─ Connection
├─ Observer
└─ 临时状态
UserProfileGrain (UserId)
├─ 用户信息
└─ 持久化状态
📌 不要让一个 Grain 既有业务状态又有连接状态
---
✅ Observer(推送到客户端)
public interface IChatClient : IGrainObserver
{
void OnMessage(string roomId, string from, string message);
}
Room Grain 保存 Observer 引用,支持:
- WebSocket
- TCP
- gRPC
✅ 状态持久化建议
| 状态 | 存储 |
|---|---|
| 房间成员 | 内存 |
| 聊天记录 | Event / DB |
| 用户资料 | SQL / Redis |
| 会话状态 | 内存 |
六、什么时候 Orleans 会“碾压” Akka?
✅ 房间数量巨大(百万级) ✅ 用户动态上下线 ✅ 状态频繁变化 ✅ 云 / K8s
---
七、一句话终极总结
> 用 Orleans,你是在“建聊天室业务”; 用 Akka.NET,你是在“造聊天室引擎”。
---
Uno Platform 上比较流行、质量高、适合学习的开源项目清单,并按「学习目的」来分类,方便你快速上手。
---
✅ 官方 & 半官方(最推荐先看)
⭐ 1️⃣ Uno Platform 官方示例(必看)
仓库:unoplatform/uno、unoplatform/Uno.Samples你能学到:
- Uno 的 整体项目结构
- 多平台(Windows / Android / iOS / WebAssembly / Skia)的差异
- XAML + C# 的标准写法
- WinUI / UWP API 在 Uno 中的实现方式
Uno.UI.SamplesUno.WinUI.Skia.Samples- WebAssembly 示例
---
⭐ 2️⃣ Uno.Extensions 示例
仓库:unoplatform/uno.extensions你能学到:
- MVVM / Reactive / DI / Navigation
- 状态管理(类似 Redux / Riverpod)
- 架构级用法(中大型项目)
---
✅ 真正的「完整 App 级别」项目
⭐ 3️⃣ ToDo / Note 类示例(Uno 官方 & 社区)
常见名字:UnoTodoUnoNotesUno.Extensions.Todo
- 真实业务逻辑
- 页面导航
- 数据绑定 + 状态管理
- 跨平台 UI 复用
---
⭐ 4️⃣ Commerce / Dashboard 示例
Uno 官方偶尔会发布:- 电商 Demo
- Dashboard / Charts Demo
- 复杂布局(Grid / Adaptive UI)
- 响应式设计
- 多分辨率 / 多平台适配
✅ 社区比较有价值的项目
⭐ 5️⃣ Uno Calculator / Gallery 类项目
关键词搜索:uno calculatoruno galleryuno sample app
- 基础控件
- 命令绑定
- XAML 写法细节
⭐ 6️⃣ Skia-only 桌面项目
关键词:Uno.WinUI.SkiaUno + Skia
- 做 跨平台桌面(Windows / macOS / Linux)
- 不关心 iOS / Android
✅ 如果你有 Android / Flutter / React 背景
对照学习建议
| 你熟悉的技术 | Uno 中对应 |
|---|---|
| Android XML | XAML |
| ViewModel | MVVM |
| LiveData | Observable / Reactive |
| Navigation Component | Uno.Extensions.Navigation |
| Flutter Provider | Uno.Extensions.Reactive |
| React State | Uno Reactive State |
✅ 学习路径建议(强烈推荐)
🔰 新手 7 步路线
1. ✅ Uno.UI.Samples(只看 XAML + 页面) 2. ✅ UnoTodo / Notes 示例 3. ✅ Uno.Extensions 示例(MVVM + DI) 4. ✅ WebAssembly 示例(看 Uno 的优势) 5. ✅ Skia 示例(桌面端) 6. ✅ 改一个示例(加页面 / 加状态) 7. ✅ 自己建项目---
✅ 总结一句话
> 学习 Uno Platform,优先看官方 Samples + Uno.Extensions,再看社区完整 App。
下面我用 “从编译 → 运行 → 部署” 的角度,把 Uno Platform 的 WebAssembly(WASM)运行与部署机制一次讲清楚,并顺便和 传统前端 / Blazor / Flutter Web 做个对比,帮助你建立正确心智模型。
---
✅ 一句话总览
> Uno WebAssembly = C# / WinUI → 编译成 .NET WASM → 在浏览器里跑 → 静态站点部署
没有服务器渲染、没有 Node 运行时、也不需要特殊后端。
---
🧠 核心运行原理(先理解这个)
Uno WASM 的本质是:
你的 C# / XAML
↓
.NET Runtime (WebAssembly)
↓
浏览器 WASM 虚拟机
↓
HTML5 Canvas / DOM
✅ 浏览器中运行的是:
- .wasm 文件
- .dll(.NET 程序集)
- JavaScript 引导代码
- HTML + CSS
- 主要走 Canvas(Skia)
- 部分平台 API 会桥接到 DOM / JS
🏗️ 构建流程(开发时)
1️⃣ 创建 Uno WASM 项目
dotnet new unoapp
生成结构(简化):
MyApp/
├─ MyApp/
│ ├─ MainPage.xaml
│ ├─ App.xaml
├─ MyApp.Wasm/
│ ├─ index.html
│ ├─ Program.cs
👉 MyApp.Wasm 就是 WebAssembly 入口项目
---
2️⃣ 本地运行(开发阶段)
dotnet run --project MyApp.Wasm
内部发生了什么:
1. C# → IL → WASM 2. 启动本地开发服务器 3. 浏览器加载:
index.htmldotnet.wasmMyApp.dll
✅ 类似:
- Blazor WASM
- Flutter Web(CanvasKit 模式)
📦 发布构建(关键)
3️⃣ 发布 WebAssembly
dotnet publish MyApp.Wasm -c Release
输出目录(非常重要):
bin/Release/netX.Y/browser-wasm/publish/wwwroot/
├─ index.html
├─ dotnet.wasm
├─ *.dll
├─ *.js
├─ *.json
👉 整个 wwwroot 是一个“纯静态网站”
---
🚀 部署方式(非常简单)
✅ Uno WASM = 静态站点
你可以部署到:
| 平台 | 可行 |
|---|---|
| GitHub Pages | ✅ |
| Azure Static Web Apps | ✅ |
| Azure Blob Static Website | ✅ |
| Netlify | ✅ |
| Vercel | ✅ |
| Nginx / Apache | ✅ |
| CDN | ✅ |
- ASP.NET Server
- Node.js
- Docker(除非你想)
示例:Nginx
server {
location / {
root /var/www/uno;
index index.html;
}
}
把 wwwroot 内容复制进去即可 ✅
---
🌐 访问流程(用户视角)
浏览器访问 URL
↓
下载 index.html
↓
加载 dotnet.wasm + dll
↓
Uno App 启动
↓
UI 显示
⚠️ 首次加载比传统 Web 大(WASM 特性)
---
🧩 与 Blazor / Flutter Web 对比
| 特性 | Uno WASM | Blazor WASM | Flutter Web |
|---|---|---|---|
| UI 技术 | WinUI / XAML | Razor | Widget |
| 运行时 | .NET WASM | .NET WASM | Dart WASM |
| 渲染 | Canvas / Skia | DOM | CanvasKit |
| 代码复用 | 100%(和桌面/移动) | Web 优先 | Flutter 体系 |
| 部署 | 静态 | 静态 | 静态 |
---
⚠️ 实际项目中要注意的点
1️⃣ 首屏体积
- WASM + .NET Runtime 较大
- 需开启:
- AOT(可选)
- IL trimming
- gzip / brotli
2️⃣ 浏览器限制
- 无多线程(部分浏览器)
- 文件系统、设备 API 受限
- 必须 async 思维
3️⃣ JS 互操作
- 可用
IJSRuntime - Uno 提供 JS interop 封装
✅ 适合用 Uno WASM 的场景
✅ 企业后台 ✅ 内部系统 ✅ 工具型应用 ✅ 跨平台统一 UI(桌面 + Web) ✅ 从 WPF / UWP / WinUI 迁移到 Web
❌ 不适合:
- SEO 重度页面
- 超轻量首屏页面
- 高交互动画 Web 游戏(除非你接受体积)
✅ 总结一句话
> Uno WebAssembly 是“把完整的 .NET + WinUI 应用,原样搬进浏览器”,部署就是一个静态站点。
---
🌟 智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
🎁 领取 2000万 Tokens