Loading...
正在加载...
请稍候

C# / .NET 跨平台运行调研

✨步子哥 (steper) 2026年01月11日 09:58

C# 的 .NET Core(以及现在统一后的 .NET)可以运行在 macOS 和 Linux 上,而且是官方支持的跨平台运行环境


✅ .NET / .NET Core 的跨平台支持

支持的操作系统

.NET Core(从 .NET 5 起统一称为 .NET原生支持以下系统

  • Windows
  • macOS
  • Linux(Ubuntu、Debian、CentOS、Alpine、RHEL 等)

同一份 C# 代码,通常无需修改即可在这些系统上运行。


✅ 可运行的应用类型

在 macOS / Linux 上可以运行:

✔ 控制台应用

dotnet run
dotnet myapp.dll

✔ Web 应用(ASP.NET Core)

  • Web API
  • MVC
  • Razor Pages
  • Minimal API

ASP.NET Core 本身就是为跨平台设计的

✔ 后台服务 / 微服务

  • Docker 容器
  • Kubernetes
  • systemd 服务(Linux)
  • launchd(macOS)

✔ 工具类程序

  • CLI 工具
  • 自动化脚本

❌ 不完全支持或不支持的情况

技术 macOS / Linux
WinForms ❌ 仅 Windows
WPF ❌ 仅 Windows
UWP / WinUI ❌ 仅 Windows
COM / Registry / Windows API

跨平台 UI 推荐:

  • .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、微服务和云原生应用。


讨论回复

7 条回复
✨步子哥 (steper) #1
2026-01-11 09:59

下面我从 定位、技术架构、跨平台能力、学习成本、适用场景 等方面,系统性地介绍 Avalonia UIUno 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 支持
  • 不关心移动端

👉 80% 桌面跨平台项目首选


✅ 选 Uno Platform 如果:

  • 你需要 桌面 + 手机 + Web
  • 你有 UWP / WinUI 经验
  • 希望 UI 更“原生”
  • 项目生命周期长、规模大

👉 企业级全平台产品首选


✅ 一句话总结

Avalonia = WPF 跨平台桌面之王
Uno = WinUI 全平台解决方案


✨步子哥 (steper) #2
2026-01-11 10:01

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
  4. 重启 Visual Studio

这一步会提供:

  • 项目模板
  • XAML 编辑支持
  • 平台配置向导

官方说明
(platform.uno)


五、步骤 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
  5. 创建并运行

✅ 方式二:命令行(更灵活)

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
✨步子哥 (steper) #3
2026-01-11 10:24

完全可以用 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)

👉 不依赖 IIS,Linux 直接运行

✅ 适合

  • 微服务
  • 内部服务通信
  • 跨语言系统

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 / 实时系统

✅ 完全不需要 IIS
✅ 运行在 Linux


四、轻量级 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
  • 高性能网络抽象
  • 用于基础设施

✅ 非 Web
✅ 跨平台


六、快速选型表(直接看这个)

需求 推荐框架
原始 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,
依然可以构建高性能、跨平台、生产级服务器程序。


✨步子哥 (steper) #4
2026-01-11 10:59

一、一句话先给结论(给忙的人)

Orleans = 为云和业务而生的“分布式状态抽象”
Akka.NET = 为并发与控制而生的“通用 Actor 系统”

如果你记住这句话,后面所有差异都会变得合理。


二、设计哲学(这是根本差异)

Orleans:Virtual Actor(“假装没有服务器”)

核心思想

Actor 永远存在,不关心它在哪个节点

  • 不需要你管理:
    • Actor 生命周期
    • Actor 分布
    • Actor 激活 / 迁移
  • 你只关心:业务逻辑 + 状态

📌 Orleans 把 分布式系统问题“藏起来”


Akka.NET:Actor Model(“你在控制一个系统”)

核心思想

你明确知道 Actor 在哪、怎么活、怎么死

  • 你要关心:
    • Actor 创建 / 停止
    • Actor 层级(父子)
    • Actor 监督策略
  • 分布式是显式能力

📌 Akka 把 并发和分布式能力“交给你”


✅ 第一性结论

问题 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 在 消息风暴 / 流处理 更强

📌 大多数业务瓶颈不在 Actor 框架


八、运维与部署成本(现实世界)


Orleans

✅ Kubernetes / 云原生
✅ 少配置
✅ 自动恢复
✅ 易监控

👉 适合小团队


Akka.NET

❌ 配置复杂
❌ 调试难
✅ 强可控
✅ 高可定制

👉 适合平台级团队


九、真实应用场景对比


✅ Orleans 最适合

  • 游戏服务器(角色 / 房间 / 匹配)
  • IoT 设备管理
  • 用户会话 / 状态服务
  • 实时业务系统
  • SaaS 后端

📌 状态 = 核心


✅ Akka.NET 最适合

  • 分布式计算引擎
  • 金融交易系统
  • 实时流处理
  • 自定义调度系统
  • 中间件 / 基础设施

📌 并发控制 = 核心


十、最终选型决策表(非常实用)

问题 选谁
我要快速做一个分布式服务 Orleans
我的系统状态非常复杂 Orleans
我需要 Event Sourcing Akka.NET
我需要精细控制 Actor 生命周期 Akka.NET
小团队 / 快上线 Orleans
架构团队 / 平台级 Akka.NET

✅ 最终一句话总结

Orleans 是“为业务服务的分布式状态引擎”
Akka.NET 是“为工程师服务的并发与分布式工具箱”


✨步子哥 (steper) #5
2026-01-11 11:07

一、聊天室业务需求(统一定义)

我们先定义完全一样的业务语义,否则对比没有意义。

✅ 聊天室需求

  • 多个聊天室(Room)
  • 多个用户(User)
  • 用户可:
    • 加入房间
    • 发送消息
    • 离开房间
  • 房间负责:
    • 维护在线用户
    • 广播消息

二、Orleans 方案(Virtual Actor 思维)


1️⃣ Orleans Grain 设计(核心)

Grain 职责拆分(非常重要)

Grain Key 职责
ChatRoomGrain RoomId 房间状态、广播
UserGrain UserId 用户状态、回调
IChatClient Observer 推送消息

📌 一个 Grain = 一个“业务实体”


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", {{LATEX:0}}"{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({{LATEX:1}}"[{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,你是在“造聊天室引擎”。


✨步子哥 (steper) #6
2026-01-11 14:17

Uno Platform 上比较流行、质量高、适合学习的开源项目清单,并按「学习目的」来分类,方便你快速上手。


✅ 官方 & 半官方(最推荐先看

⭐ 1️⃣ Uno Platform 官方示例(必看)

仓库: unoplatform/unounoplatform/Uno.Samples

你能学到:

  • Uno 的 整体项目结构
  • 多平台(Windows / Android / iOS / WebAssembly / Skia)的差异
  • XAML + C# 的标准写法
  • WinUI / UWP API 在 Uno 中的实现方式

👉 重点看:

  • Uno.UI.Samples
  • Uno.WinUI.Skia.Samples
  • WebAssembly 示例

相当于 Uno 的 “官方教科书”


⭐ 2️⃣ Uno.Extensions 示例

仓库: unoplatform/uno.extensions

你能学到:

  • MVVM / Reactive / DI / Navigation
  • 状态管理(类似 Redux / Riverpod)
  • 架构级用法(中大型项目)

✅ 如果你关心 工程化、可维护性,这是必学


✅ 真正的「完整 App 级别」项目

⭐ 3️⃣ ToDo / Note 类示例(Uno 官方 & 社区)

常见名字:

  • UnoTodo
  • UnoNotes
  • Uno.Extensions.Todo

你能学到:

  • 真实业务逻辑
  • 页面导航
  • 数据绑定 + 状态管理
  • 跨平台 UI 复用

非常适合从 Android/Flutter 转过来的人


⭐ 4️⃣ Commerce / Dashboard 示例

Uno 官方偶尔会发布:

  • 电商 Demo
  • Dashboard / Charts Demo

你能学到:

  • 复杂布局(Grid / Adaptive UI)
  • 响应式设计
  • 多分辨率 / 多平台适配

✅ 社区比较有价值的项目

⭐ 5️⃣ Uno Calculator / Gallery 类项目

关键词搜索:

  • uno calculator
  • uno gallery
  • uno sample app

你能学到:

  • 基础控件
  • 命令绑定
  • XAML 写法细节

⭐ 6️⃣ Skia-only 桌面项目

关键词:

  • Uno.WinUI.Skia
  • Uno + 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。

✨步子哥 (steper) #7
2026-01-11 14:18

下面我用 “从编译 → 运行 → 部署” 的角度,把 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

✅ UI 渲染方式:

  • 主要走 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.html
    • dotnet.wasm
    • MyApp.dll
  4. Uno UI 初始化 → 渲染到 Canvas

✅ 类似:

  • 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 体系
部署 静态 静态 静态

Uno 最大优势:

同一套 WinUI UI + C# 业务逻辑,直接跑在浏览器


⚠️ 实际项目中要注意的点

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 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录