NewLife.Remoting 3.5.2025.827-beta1704

This is a prerelease version of NewLife.Remoting.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package NewLife.Remoting --version 3.5.2025.827-beta1704
                    
NuGet\Install-Package NewLife.Remoting -Version 3.5.2025.827-beta1704
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="NewLife.Remoting" Version="3.5.2025.827-beta1704" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="NewLife.Remoting" Version="3.5.2025.827-beta1704" />
                    
Directory.Packages.props
<PackageReference Include="NewLife.Remoting" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add NewLife.Remoting --version 3.5.2025.827-beta1704
                    
#r "nuget: NewLife.Remoting, 3.5.2025.827-beta1704"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package NewLife.Remoting@3.5.2025.827-beta1704
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=NewLife.Remoting&version=3.5.2025.827-beta1704&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=NewLife.Remoting&version=3.5.2025.827-beta1704&prerelease
                    
Install as a Cake Tool

NewLife.Remoting - 统一高性能远程通信框架 (RPC + HTTP + WebSocket + SRMP)

GitHub top language GitHub License Nuget Downloads Nuget Nuget (with prereleases)

Nuget Downloads Nuget Nuget (with prereleases)

简单、统一、可扩展、跨多目标框架 (net45 ~ net9.0) 的远程通信基础设施。单一生态内同时覆盖:

  • 二进制高性能 RPC (长连接 / 主动下发 / 海量连接与吞吐)
  • 标准 HTTP / REST (易集群 / 生态丰富 / 负载均衡)
  • WebSocket 指令下发与事件推送
  • SRMP (Simple Remote Message Protocol) 远程消息协议
  • 统一应用客户端基类 ClientBase(登录 / 心跳 / 升级 / 指令 / 事件)

源码:https://github.com/NewLifeX/NewLife.Remoting
NuGet:NewLife.Remoting / NewLife.Remoting.Extensions


目录导航


核心特性

  1. 双架构:同一套模型同时支持【高性能二进制 RPC】与【标准 HTTP/REST】
  2. 海量连接:单机典型 1 万 TCP 长连接,实验峰值 400 万;吞吐典型 10 万 TPS,实验峰值 2266 万 TPS(依赖 NewLife.Net 内核)
  3. 零第三方重依赖:日志 / 序列化 / 网络栈 / 对象池 均为自研生态,可控可裁剪
  4. 可观测性:内置性能统计、慢调用跟踪、分布式追踪接口 (ITracer)
  5. 统一客户端生命周期:登录、心跳、升级、指令、事件上报 一站式封装
  6. SRMP 协议:Header + Body 简洁帧格式,支持粘拆包、双向消息、OneWay、Reply 标识
  7. 安全:令牌颁发 + 可插拔密码/签名提供者 + Token 续期策略
  8. WebSocket 通道:HTTP 架构下的实时指令下发与推送
  9. 控制器模型:与 WebApi 类似的 Controller/Action 调用体验(ApiServer / ApiController)
  10. 扩展组建:NewLife.Remoting.Extensions 提供 ASP.NET Core 设备接入基类、令牌服务、会话管理、模型绑定器

架构概览

          +-------------------+                     +--------------------+
          |  客户端 ClientBase |                     |  服务端 ApiServer   |
          |  (ApiClient/HTTP) |  <--- SRMP/TCP --->  |  控制器/Handler     |
          +---------+---------+                     +----+-----------+----+
                    | HTTP/REST 负载均衡                  | 注册服务/依赖注入
                    v                                   v
          +-------------------+   WebSocket   +--------------------------+
          | ApiHttpClient     |<------------->|  BaseDeviceController    |
          +-------------------+  指令/事件     +-----------+--------------+
                                                     | TokenService
                                                     | SessionManager
                                                     v
                                              +---------------+
                                              | 业务/存储/缓存 |
                                              +---------------+
  • RPC:长连接 / 二进制 / 低开销 / 服务端可主动推送
  • HTTP:标准化 / 容易接入网关 / 每次独立认证 / WebSocket 下发指令
  • 二者共享:登录模型、心跳语义、令牌机制、序列化策略、事件与指令抽象

适用场景对比

维度 RPC 架构 HTTP 架构
连接模型 长连接 (TCP/UDP) 短连接 + 可选 WebSocket
吞吐/延迟 极致性能/低延迟 受 HTTP 栈 & 负载均衡影响
推送能力 服务端直接下发 需 WebSocket 通道
负载均衡 客户端挑选一个节点保持 请求级(云原生友好)
二进制大包 友好(自定义序列化) 不适合(默认 JSON)
接入复杂度 需要 SDK/协议 任意 HTTP 客户端即可
典型场景 任务调度、物联网网关、工业采集 设备管理平台、通用 REST、混合接入

快速开始

安装模板(推荐)

dotnet new install NewLife.Templates

RPC 服务端最小示例

dotnet new rpcserver --name RpcServer
cd RpcServer
dotnet run

核心代码(示意):

var server = new ApiServer(12345);
server.Register(new MyController(), null); // 暴露控制器全部 Action
server.Start();

public class MyController : ApiController
{
    public String Ping(String name) => $"Hello {name}, {DateTime.Now:HH:mm:ss}";
}

RPC 客户端调用示例

var client = new ApiClient("tcp://127.0.0.1:12345");
await client.OpenAsync();
var rs = await client.InvokeAsync<String>("My/Ping", new { name = "dev" });
Console.WriteLine(rs);

HTTP + WebSocket 设备接入

Program.cs 中:

builder.Services.AddRemoting();
var app = builder.Build();
app.UseRemoting();
app.MapControllers();
app.Run();

public class DeviceController : BaseDeviceController
{
    public DeviceController(IServiceProvider p) : base(p) { }
}

客户端使用 ApiHttpClient 登录 + 周期 Ping,服务端可通过 WebSocket 通道下发指令。


统一客户端 ClientBase 能力

ClientBase 抽象了设备 / 节点 / 应用常见生命周期:

  • 登录:多种模式(应用 AppId/AppSecret、设备 Code/Secret、OAuth)
  • 心跳:带服务器时间、令牌续期、保持在线状态
  • 升级:统一 Upgrade 查询,返回版本与下载地址(自动补全绝对路径)
  • 指令:RPC 直接下发;HTTP 通过 WebSocket 推送;客户端统一 CommandReply 回执
  • 事件:批量上报 EventModel[]
  • 安全:内置时间戳 + 签名/令牌 验证流程

SRMP 协议简介

SRMP (Simple Remote Message Protocol):

  • 面向消息的远程调用与推送协议
  • 支持标志位:OneWay / Reply / Flag 扩展
  • 设计目标:比 HTTP 更低的开销;比原始 TCP 更易解析与调试
  • 在 ApiNetServer 中通过 WebSocketServerCodec + 标准消息编解码器组合使用 详见:Doc/SRMP.MD

性能指标

指标 典型值 实验峰值 说明
TCP 长连接数 10,000 4,000,000 依赖内核与系统参数调优
RPC 吞吐 100,000 TPS 22,660,000 TPS 简单回显场景,基于 NewLife.Net
HTTP 并发连接 1,000 (可水平扩展) 受 Kestrel/网关限制
心跳开销 微秒级 - 轻量协议 + 对象池复用

建议结合实际业务压测,关注序列化体积与对象分配。


认证与安全

  • 登录:设备 / 应用 / OAuth 三模式;成功返回访问令牌 + 过期时间
  • 令牌续期:心跳内置检测,10 分钟内到期可自动刷新(可扩展策略)
  • 密钥保护:SaltPasswordProvider(可替换)避免明文密钥直接传输
  • 会话管理:SessionManager(WebSocket 长连接登记、关闭释放)
  • 异常:统一 ApiException + ApiCode,避免泄漏内部实现细节

扩展与二次开发

可扩展点:

  1. 自定义序列化:实现 IJsonHost / 二进制编码器替换 Encoder
  2. 自定义认证:替换 TokenService 或 IPasswordProvider
  3. 控制器解析:通过 ApiServer.Register(controller, method)
  4. 消息拦截:订阅 ApiServer.Received 统一埋点 / 鉴权 / 限流
  5. 协议扩展:在 ApiNetServer.Init 中追加自定义 Codec
  6. 事件与指令:实现 IDeviceService / 使用 CommandReply & PostEvents
  7. 日志与追踪:注入 ILog / ITracer,实现链路关联

与其它 NewLife 组件协同

组件 协同价值
NewLife.Core 日志、配置、序列化、对象池、TimerX、性能追踪
NewLife.Net 高性能网络栈、WebSocket/编码器、端口复用
NewLife.Redis 分布式缓存 / 消息队列,扩展会话共享或推送 fanout
Stardust 节点注册、配置中心、APM、发布中心;可托管 ApiServer 节点
AntJob 使用 ClientBase 接入任务调度与分布式计算
NewLife.MQTT / Modbus / IoT 设备层协议采集后通过 Remoting 上行

多目标框架兼容策略

  • 支持:net45 / net461 / netstandard2.0 / netstandard2.1 / net5.0~net9.0
  • 通过条件编译隔离新旧 API(Span / ValueTask / Socket 特性等)
  • 遵循:不主动移除旧 TFM;新增功能优先判断可用性再启用

项目生态矩阵

完整生态与说明见下方 新生命项目矩阵。Remoting 作为“通信基座”横向衔接 网关设备接入 / 调度平台 / 分布式服务治理 / IoT 协议栈。


贡献与反馈

欢迎:Bug 反馈 / 性能优化 PR / 新协议编解码 / 控制器示例 / 文档补充。
提交前请阅读 .github/copilot-instructions.md 了解编码规范 & Multi‑TFM 原则。
Issue 讨论请尽量提供:运行环境、目标框架、最小可复现代码、日志摘要。


快速命令回顾

# 安装模板
dotnet new install NewLife.Templates
# 创建 RPC 服务端骨架
dotnet new rpcserver --name RpcServer
# 运行
dotnet run

新生命项目矩阵

各项目默认支持 net9.0/netstandard2.1/netstandard2.0/net4.62/net4.5,旧版(2024.0801)支持 net4.0/net2.0

项目 年份 说明
NewLife.Core 2002 核心库,日志、配置、缓存、网络、序列化、APM性能追踪
NewLife.XCode 2005 大数据中间件,单表百亿级,自动分表,读写分离
NewLife.Net 2005 网络库,2266万 tps / 百万连接
NewLife.Remoting 2011 本项目,双协议通信框架
NewLife.Cube 2010 快速开发平台,权限 / OAuth / SSO
NewLife.Agent 2008 服务安装 / 守护进程 / Systemd
NewLife.Zero 2020 项目脚手架模板集合
NewLife.Redis 2017 高性能 Redis 客户端/消息队列
NewLife.RocketMQ 2018 纯托管 RocketMQ 客户端
NewLife.MQTT 2019 物联网 MqttClient/MqttServer
NewLife.IoT 2022 IoT 通信标准模型库
NewLife.Modbus 2022 Modbus 协议族
NewLife.Siemens 2022 西门子 PLC 通信
NewLife.Map 2022 地图聚合组件
NewLife.Audio 2023 音频编解码
Stardust 2018 分布式服务平台 (注册/配置/APM/发布)
AntJob 2019 分布式大数据计算平台
等等 - 更多参见官网

团队与版权

XCode

新生命团队(NewLife)成立于 2002 年,80+ 开源项目,NuGet 累计下载 400+ 万。全部项目采用 MIT 协议,可自由修改再发行(无需声明来源)。
网站:https://newlifex.com
开源:https://github.com/NewLifeX
QQ群:1600800 / 1600838

新生命团队始于2002年,部分开源项目具有20年以上历史,源码库保留2010年以来全部记录。

微信公众号:
智能大石头


变更记录

请关注 Release / Tag 说明或提交历史。后续可引入 CHANGELOG 简述关键性能与兼容性变更。


License

MIT © NewLife. 欢迎商用与二次开发。

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net45 is compatible.  net451 was computed.  net452 was computed.  net46 was computed.  net461 is compatible.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on NewLife.Remoting:

Package Downloads
NewLife.Stardust

星尘,分布式服务框架。节点管理,监控中心,配置中心,发布中心,注册中心

NewLife.MQTT

流行的物联网通信协议MQTT,包括客户端、服务端

NewLife.Net

网络通讯基础框架及各种协议实现。

NewLife.AntJob

分布式任务调度系统,纯NET打造的重量级大数据实时计算平台,万亿级调度经验积累。

NewLife.Remoting.Extensions

提供WebApi应用级服务端

GitHub repositories (6)

Showing the top 6 popular GitHub repositories that depend on NewLife.Remoting:

Repository Stars
NewLifeX/X
Core basic components: log (file / network), configuration (XML / JSON / HTTP), cache (memory / redis), network (TCP / UDP / HTTP), RPC framework, serialization (binary / XML / JSON), APM performance tracking. 核心基础组件,日志(文件/网络)、配置(XML/Json/Http)、缓存(内存/Redis)、网络(Tcp/Udp/Http)、RPC框架、序列化(Binary/XML/Json)、APM性能追踪。
NewLifeX/AntJob
高吞吐 .NET 分布式任务与实时数据调度平台:时间/数据/消息/Cron/SQL/脚本切片,自动重试与弹性扩缩,回溯补算 + Web 控制台。High‑throughput .NET distributed job & real‑time scheduler with fine‑grained slicing, retries, elastic scaling & web console.
NewLifeX/Stardust
星尘,轻量级分布式服务框架。配置中心、集群管理、远程自动发布、服务治理。服务自动注册和发现,负载均衡,动态伸缩,故障转移,性能监控。
NewLifeX/XCoder
新生命码神工具,代码生成、网络工具、API工具、串口工具、正则工具、图标工具、加解密工具、地图接口。
NewLifeX/NewLife.Net
单机吞吐2266万tps的网络通信框架
NewLifeX/NewLife.MQTT
最流行的物联网通信协议MQTT,包括客户端、服务端和Web管理平台
Version Downloads Last Updated
3.5.2025.901-beta0603 0 9/1/2025
3.5.2025.830-beta1611 92 8/30/2025
3.5.2025.827-beta1704 153 8/27/2025
3.5.2025.826-beta0442 170 8/26/2025
3.5.2025.825-beta2351 171 8/25/2025
3.5.2025.824-beta1236 161 8/24/2025
3.5.2025.822-beta0944 96 8/22/2025
3.5.2025.820-beta1825 128 8/20/2025
3.5.2025.818-beta1634 216 8/18/2025
3.5.2025.812-beta1259 189 8/12/2025
3.4.2025.812-beta1032 136 8/12/2025
3.4.2025.812-beta1003 135 8/12/2025
3.4.2025.808-beta1105 318 8/8/2025
3.4.2025.805-beta1659 225 8/5/2025
3.4.2025.805-beta1531 218 8/5/2025
3.4.2025.801 598 8/1/2025
3.4.2025.801-beta0218 118 8/1/2025
3.4.2025.731-beta0004 120 7/31/2025
3.4.2025.722-beta0820 498 7/22/2025
3.4.2025.719-beta0004 24 7/19/2025
3.4.2025.713-beta1545 299 7/13/2025
3.4.2025.713-beta1351 209 7/13/2025
3.4.2025.713-beta1335 144 7/13/2025
3.3.2025.709-beta0306 142 7/9/2025
3.3.2025.701 1,165 7/1/2025
3.3.2025.701-beta0355 143 7/1/2025
3.3.2025.616-beta1415 243 6/16/2025
3.3.2025.610-beta0350 295 6/10/2025
3.3.2025.601 1,353 6/1/2025
3.3.2025.601-beta0800 111 6/1/2025
3.3.2025.527-beta1716 207 5/27/2025
3.3.2025.521-beta1200 315 5/21/2025
3.3.2025.519-beta1620 202 5/19/2025
3.3.2025.515-beta1338 370 5/15/2025
3.3.2025.514-beta0417 233 5/14/2025
3.3.2025.501 1,259 5/1/2025
3.3.2025.501-beta1629 154 5/1/2025
3.3.2025.428-beta0633 172 4/28/2025
3.3.2025.426-beta1312 200 4/26/2025
3.3.2025.417-beta1306 205 4/17/2025
3.3.2025.415-beta1725 206 4/15/2025
3.3.2025.415-beta1203 320 4/15/2025
3.3.2025.415-beta1143 201 4/15/2025
3.3.2025.412-beta0428 144 4/12/2025
3.3.2025.401 3,186 4/1/2025
3.3.2025.401-beta0524 163 4/1/2025
3.3.2025.329-beta1224 108 3/29/2025
3.3.2025.301 1,258 3/1/2025
3.3.2025.301-beta0131 113 3/1/2025
3.3.2025.226-beta0837 188 2/26/2025
3.3.2025.225-beta1354 111 2/25/2025
3.3.2025.225-beta1254 105 2/25/2025
3.3.2025.225-beta0533 106 2/25/2025
3.3.2025.224-beta1623 108 2/24/2025
3.2.2025.224-beta1147 106 2/24/2025
3.2.2025.221-beta0925 113 2/21/2025
3.2.2025.212-beta1257 121 2/12/2025
3.2.2025.207-beta0905 106 2/7/2025
3.2.2025.201 1,264 2/1/2025
3.2.2025.201-beta1615 118 2/1/2025
3.2.2025.109-beta1236 1,282 1/9/2025
3.2.2025.103-beta1513 268 1/3/2025
3.2.2025.101 8,148 1/1/2025
3.2.2025.101-beta0602 122 1/1/2025
3.2.2024.1225-beta1616 204 12/25/2024
3.2.2024.1206 1,529 12/6/2024
3.1.2024.1103-beta0605 120 11/3/2024
3.1.2024.1101 2,043 11/1/2024
3.1.2024.1002 1,124 10/2/2024
3.1.2024.923-beta0435 183 9/23/2024
3.1.2024.914-beta0002 237 9/14/2024
3.1.2024.913-beta0902 126 9/13/2024
3.1.2024.912-beta0006 135 9/12/2024
3.0.2024.902 1,609 9/2/2024
3.0.2024.812-beta0813 215 8/12/2024
3.0.2024.811-beta0608 149 8/11/2024
3.0.2024.806-beta0146 184 8/6/2024
3.0.2024.805 1,852 8/5/2024
3.0.2024.729-beta0815 673 7/29/2024
3.0.2024.710-beta1226 570 7/10/2024
3.0.2024.708 19,995 7/8/2024
3.0.2024.708-beta1003 136 7/8/2024
3.0.2024.703-beta0048 144 7/3/2024
3.0.2024.701 535 7/1/2024
3.0.2024.701-beta0219 125 7/1/2024
3.0.2024.630-beta0606 135 6/30/2024
3.0.2024.628-beta0626 271 6/28/2024
3.0.2024.627-beta1636 292 6/27/2024
3.0.2024.627-beta0009 144 6/27/2024
3.0.2024.626-beta1337 207 6/26/2024
3.0.2024.625-beta1714 196 6/25/2024
3.0.2024.625-beta1600 131 6/25/2024
3.0.2024.625-beta0716 142 6/25/2024
3.0.2024.624-beta1110 271 6/24/2024
3.0.2024.624-beta0627 145 6/24/2024
3.0.2024.624-beta0109 133 6/24/2024
3.0.2024.623-beta0607 224 6/23/2024
3.0.2024.622-beta1613 166 6/22/2024
2.8.2024.428-beta0930 842 4/28/2024
2.8.2024.402 13,621 4/2/2024
2.7.2024.202 1,224 2/2/2024
2.7.2024.101 1,644 1/1/2024
2.7.2024.101-beta0500 136 1/1/2024
2.7.2023.1218-beta1127 158 12/18/2023
2.7.2023.1209-beta1634 575 12/9/2023
2.7.2023.1201 2,212 12/1/2023
2.7.2023.1201-beta0310 103 12/1/2023
2.6.2023.1128-beta0013 125 11/28/2023
2.6.2023.1111-beta1140 152 11/11/2023
2.6.2023.1110-beta1323 152 11/10/2023
2.5.2023.1102 2,500 11/2/2023
2.5.2023.1102-beta0640 133 11/2/2023
2.5.2023.1101-beta0904 125 11/1/2023
2.5.2023.1031-beta0703 115 10/31/2023
2.4.2023.1028-beta0057 146 10/28/2023
2.4.2023.1001 3,555 10/1/2023
2.3.2023.907 658 9/7/2023
2.3.2023.903-beta1652 163 9/3/2023
2.3.2023.902-beta1701 254 9/2/2023
2.2.2023.902-beta1549 157 9/2/2023
2.2.2023.814 669 8/14/2023
2.2.2023.814-beta1331 164 8/14/2023
2.2.2023.707 2,945 7/7/2023
2.2.2023.707-beta0102 211 7/7/2023
2.1.2023.705-beta1042 210 7/5/2023
2.1.2023.704-beta0222 187 7/4/2023
2.1.2023.601 2,352 6/1/2023
2.1.2023.601-beta1433 197 6/1/2023
2.1.2023.516-beta0658 779 5/16/2023
2.1.2023.512 910 5/12/2023
2.1.2023.512-beta1533 189 5/12/2023
2.1.2023.401 2,340 4/1/2023
2.1.2023.401-beta1728 200 4/1/2023
2.1.2023.325-beta0151 399 3/25/2023
2.1.2023.301 2,554 3/1/2023
2.1.2023.301-beta0446 207 3/1/2023
2.0.2023.218-beta0230 412 2/18/2023
2.0.2023.214-beta1534 576 2/14/2023
2.0.2023.203 3,109 2/3/2023
2.0.2023.203-beta1355 189 2/3/2023
2.0.2023.203-beta1201 198 2/3/2023
2.0.2023.101 1,656 1/1/2023
2.0.2023.101-beta0306 214 1/1/2023
2.0.2022.1223-beta0408 1,633 12/23/2022
2.0.2022.1201 2,158 12/1/2022
2.0.2022.1201-beta1441 174 12/1/2022
2.0.2022.1127-beta0246 1,483 11/27/2022
2.0.2022.1109-beta0328 397 11/9/2022
2.0.2022.1101 3,042 11/1/2022
2.0.2022.1101-beta0755 235 11/1/2022
2.0.2022.1004 1,031 10/4/2022
2.0.2022.1004-beta0332 214 10/4/2022
2.0.2022.901 6,287 9/1/2022
2.0.2022.901-beta0405 224 9/1/2022
2.0.2022.813-beta1441 615 8/13/2022
2.0.2022.810-beta0529 306 8/10/2022

IDeviceService引入DeviceContext实现横切