![]() |
VOOZH | about |
dotnet add package SAEA.Common --version 26.4.23.1
NuGet\Install-Package SAEA.Common -Version 26.4.23.1
<PackageReference Include="SAEA.Common" Version="26.4.23.1" />
<PackageVersion Include="SAEA.Common" Version="26.4.23.1" />Directory.Packages.props
<PackageReference Include="SAEA.Common" />Project file
paket add SAEA.Common --version 26.4.23.1
#r "nuget: SAEA.Common, 26.4.23.1"
#:package SAEA.Common@26.4.23.1
#addin nuget:?package=SAEA.Common&version=26.4.23.1Install as a Cake Addin
#tool nuget:?package=SAEA.Common&version=26.4.23.1Install as a Cake Tool
| 中文版
基于 .NET Standard 2.0 的高性能通用工具类库,提供序列化、缓存、加密、网络请求等基础能力,是 SAEA 项目家族的核心依赖。
| 章节 | 内容 |
|---|---|
| ⚡ 30秒快速开始 | 最简单的上手示例 |
| 🎯 核心特性 | 类库的主要功能 |
| 📐 架构设计 | 模块结构与组件关系 |
| 💡 应用场景 | 何时使用各工具类 |
| 📊 性能对比 | 序列化性能对比数据 |
| ❓ 常见问题 | FAQ 快速解答 |
| 🔧 核心类 | 主要类一览 |
| 📝 使用示例 | 详细代码示例 |
最快上手方式,只需3步即可使用序列化和缓存功能:
dotnet add package SAEA.Common
using SAEA.Common.Serialization;
// 序列化对象
var json = SerializeHelper.Serialize(new { Name = "SAEA", Version = "7.26" });
// 反序列化对象
var obj = SerializeHelper.Deserialize<MyClass>(json);
// 或者使用扩展方法
var json2 = myObject.ToJsonString();
var obj2 = json.JsonToObj<MyClass>();
using SAEA.Common.Caching;
// 创建10分钟自动过期的缓存
var cache = new MemoryCache<string>(TimeSpan.FromMinutes(10));
cache.Set("key", "value");
var val = cache.Get("key");
var val2 = cache.GetOrAdd("key2", () => ComputeExpensiveValue());
就这么简单! 🎉 你已经掌握了 SAEA.Common 的核心用法。
| 特性 | 说明 | 优势 |
|---|---|---|
| 📦 多格式序列化 | JSON / Protobuf / Binary 三种方式 | 灵活选择,满足不同场景需求 |
| ⚡ 高性能缓存 | MemoryCache / BlockingQueue / FastQueue | 减少重复计算,提升响应速度 |
| 🔒 加密与压缩 | AES / MD5 / GZip / Deflate | 数据安全与传输优化 |
| 🌐 网络请求 | HttpClient 连接池 / WebClient 扩展 | 连接复用,支持重试机制 |
| 📁 文件操作 | 同步/异步读写,流式处理 | 高效IO,支持大文件处理 |
| ⏰ 时间处理 | 时区转换 / Unix时间戳 / 格式化 | 跨时区应用无忧 |
| 🔄 对象复制 | 表达式树高性能深拷贝 | 比反射快10倍以上 |
| 📝 异步日志 | 批量写入 / 文件滚动 / 控制台彩色 | 生产环境日志解决方案 |
┌─────────────────────────────────────────────────────────────┐
│ SAEA.Common 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Serialize │ │ Caching │ │ Encryption │ │
│ │ 序列化模块 │ │ 缓存模块 │ │ 加密模块 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ JSON/PB/ │ │MemoryCache │ │ AES/MD5/ │ │
│ │ Binary │ │Queue/Batcher│ │ GZip │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Network │ │ IO │ │ Utils │ │
│ │ 网络模块 │ │ 文件模块 │ │ 工具模块 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │HttpClient │ │FileHelper │ │LogHelper │ │
│ │ApiHelper │ │Async RW │ │ConfigHelper │ │
│ └─────────────┘ └─────────────┘ │FastCopy │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
序列化流程:
对象 ──► SerializeHelper ──► 格式选择
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
JSON序列化 Protobuf序列化 Binary序列化
(可读性强) (高性能小体积) (兼容性好)
│ │ │
└───────────────┴───────────────┘
│
▼
byte[] / string
缓存流程:
请求数据 ──► 检查缓存
│
┌───────┴───────┐
│ │
命中 未命中
│ │
▼ ▼
返回缓存值 计算新值 ──► 存入缓存 ──► 返回
│
▼
过期自动清理
| 模块 | 场景 | 推荐理由 |
|---|---|---|
| 📦 序列化 | API 响应、数据存储、RPC 通信 | 多格式支持,一套代码多种输出 |
| ⚡ 缓存 | 热点数据、配置缓存、限流计数 | 内存缓存零 IO 延迟 |
| 📋 队列 | 任务调度、消息处理、生产消费模型 | 线程安全,支持阻塞/异步 |
| 🔒 加密 | 密码存储、敏感数据保护、数据签名 | AES 对称加密,安全可靠 |
| 📦 压缩 | 网络传输、日志归档、大文件存储 | GZip/Deflate 双模式 |
| 🌐 网络 | HTTP API 调用、Web 抓取、第三方集成 | 连接池复用,自动重试 |
| 📁 文件 | 日志写入、配置存储、临时文件 | 同步异步双模式 |
| 🔄 复制 | DTO 转换、实体映射、深拷贝 | 表达式树,性能极致 |
| 场景 | 推荐替代方案 |
|---|---|
| 分布式缓存 | 使用 Redis (SAEA.RedisSocket) |
| 高吞吐消息队列 | 使用 RabbitMQ / Kafka |
| 大规模日志收集 | 使用 ELK / Seq |
| 数据库访问 | 使用 EF Core / Dapper |
| 格式 | 序列化速度 | 反序列化速度 | 数据大小 | 适用场景 |
|---|---|---|---|---|
| JSON | ⭐⭐⭐ | ⭐⭐⭐ | 较大 | API 通信、配置文件 |
| Protobuf | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 最小 | RPC 通信、存储 |
| Binary | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 中等 | 内部通信、兼容性好 |
| 方式 | 性能 | 说明 |
|---|---|---|
| FastCopy (表达式树) | ⭐⭐⭐⭐⭐ | 编译后直接调用,性能最优 |
| ModelCloneHelper | ⭐⭐⭐⭐ | 反射缓存优化,灵活性好 |
| 传统反射 | ⭐⭐ | 每次反射,性能最差 |
| 组件 | 特点 | 吞吐量 | 适用场景 |
|---|---|---|---|
| MemoryCache | 自动过期、线程安全 | 高 | 短期缓存、配置缓存 |
| BlockingQueue | 阻塞式、线程安全 | 中 | 生产消费模型 |
| FastQueue | 异步、基于 Channels | 极高 | 高吞吐异步处理 |
💡 提示: FastQueue 基于
System.Threading.Channels实现,是 .NET Core 推荐的高性能异步队列方案。
A:
// JSON - 可读性好
var json = SerializeHelper.Serialize(obj);
// Protobuf - 性能最优
var bytes = SerializeHelper.PBSerialize(obj);
A: 创建时指定过期时间,过期后自动清理:
// 10分钟后过期
var cache = new MemoryCache<string>(TimeSpan.FromMinutes(10));
// 永不过期(使用最大值)
var permanent = new MemoryCache<string>(TimeSpan.MaxValue);
A: 使用 FastCopy 表达式树复制,比反射快 10 倍以上:
// 深拷贝(反射方式,简单但较慢)
var copy1 = myObject.DeepCopy();
// 表达式树复制(最快,编译后直接调用)
var copy2 = FastCopy<MyClass, MyClass>.Copy(myObject);
// 不同类型间映射
var dto = ModelCloneHelper.Copy<UserDto>(userEntity);
A: 密码可以是任意字符串,内部会自动转换为密钥:
// 加密
var encrypted = AESHelper.Encrypt("敏感数据", "your-password");
// 解密
var original = AESHelper.Decrypt(encrypted, "your-password");
A:
await),高吞吐,推荐用于 .NET Core// FastQueue - 异步(推荐)
var data = await fastQueue.ReadAsync();
await fastQueue.WriteAsync("data");
// BlockingQueue - 同步阻塞
var item = queue.Dequeue(TimeSpan.FromSeconds(5));
A: 使用 LogHelper 内置异步批量写入:
// 自动异步写入文件
LogHelper.Info("普通信息");
LogHelper.Warn("警告信息");
LogHelper.Error("错误信息", exception);
// 控制台彩色输出
ConsoleHelper.WriteLine("成功", ConsoleColor.Green);
ConsoleHelper.WriteLineError("失败", ConsoleColor.Red);
A: 默认保存在程序运行目录,以 {类名}.json 命名:
// 创建配置对象
var config = new ConfigHelper<AppConfig>();
config.Instance.ServerIP = "127.0.0.1";
config.Save(); // 保存到 AppConfig.json
// 下次启动自动加载
var loaded = config.Read();
| 类名 | 说明 |
|---|---|
SerializeHelper |
核心序列化工具,支持 JSON/Protobuf/Binary |
JsonConvert |
JSON 转换器 |
JsonSerializer |
JSON 序列化器 |
| 类名 | 说明 |
|---|---|
MemoryCache<T> |
自定义过期缓存,自动清理机制 |
BlockingQueue<T> |
阻塞式线程安全队列 |
FastQueue<T> |
基于 Channels 的高性能异步队列 |
HashMap<T1,T2,T3> |
类似 Redis HashSet 的多层键值存储 |
Batcher<T> |
批量数据打包处理 |
| 类名 | 说明 |
|---|---|
AESHelper |
AES 对称加密/解密 |
MD5Helper |
MD5 哈希计算(字符串、文件、流) |
GZipHelper |
GZip/Deflate 压缩解压 |
| 类名 | 说明 |
|---|---|
HttpClientHelper |
HttpClient 连接池封装 |
ApiHelper |
WebClient 扩展,支持重试、日志跟踪 |
FileHelper |
文件读写操作(同步/异步) |
IPHelper |
IP 地址工具,端口检测 |
DNSHelper |
DNS 解析工具 |
| 类名 | 说明 |
|---|---|
DateTimeHelper |
时间处理,时区转换,Unix 时间戳 |
ByteHelper |
字节操作,位操作扩展 |
HexConverter |
自定义进制转换 |
LogHelper |
异步日志记录 |
ConsoleHelper |
控制台彩色输出 |
ConfigHelper<T> |
对象持久化配置 |
ModelCloneHelper |
实体属性复制转换 |
FastCopy<TIn,TOut> |
表达式树高性能复制 |
using SAEA.Common.Serialization;
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
var user = new User { Name = "张三", Age = 25 };
// 方式1: 静态方法
var json = SerializeHelper.Serialize(user);
var obj = SerializeHelper.Deserialize<User>(json);
// 方式2: 扩展方法
var json2 = user.ToJsonString();
var obj2 = json2.JsonToObj<User>();
using SAEA.Common.Serialization;
[ProtoContract] // 需要添加 ProtoContract 特性
public class ProtoUser
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public int Age { get; set; }
}
var user = new ProtoUser { Name = "张三", Age = 25 };
// 序列化为二进制
var bytes = SerializeHelper.PBSerialize(user);
// 反序列化
var obj = SerializeHelper.PBDeserialize<ProtoUser>(bytes);
using SAEA.Common.Serialization;
// 序列化
var bytes = myObject.ToBytes();
// 反序列化
var obj = bytes.ToInstance<MyClass>();
using SAEA.Common.Caching;
// 创建10分钟过期缓存
var cache = new MemoryCache<string>(TimeSpan.FromMinutes(10));
// 设置值
cache.Set("key1", "value1");
// 获取值
var value = cache.Get("key1");
// 获取或添加(懒加载)
var value2 = cache.GetOrAdd("key2", () =>
{
// 只有在 key2 不存在时才执行
return ExpensiveComputation();
});
// 删除
cache.Remove("key1");
// 清空
cache.Clear();
using SAEA.Common.Caching;
var queue = new BlockingQueue<int>();
// 生产者线程
Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
queue.Enqueue(i);
Thread.Sleep(100);
}
});
// 消费者线程
Task.Run(() =>
{
while (true)
{
// 阻塞等待,最多等5秒
var item = queue.Dequeue(TimeSpan.FromSeconds(5));
if (item != default)
{
Console.WriteLine($"处理: {item}");
}
}
});
using SAEA.Common.Caching;
var queue = new FastQueue<string>();
// 生产者
_ = Task.Run(async () =>
{
for (int i = 0; i < 100; i++)
{
await queue.WriteAsync($"数据{i}");
await Task.Delay(100);
}
});
// 消费者
_ = Task.Run(async () =>
{
while (true)
{
var data = await queue.ReadAsync();
Console.WriteLine($"处理: {data}");
}
});
using SAEA.Common.Caching;
var batcher = new Batcher<int>(batchSize: 100);
// 注册批量处理事件
batcher.OnBatch += (items) =>
{
Console.WriteLine($"批量处理 {items.Count} 条数据");
// 批量写入数据库...
};
// 添加数据
for (int i = 0; i < 500; i++)
{
batcher.Add(i);
}
// 手动触发处理
batcher.Flush();
using SAEA.Common.Encryption;
string plainText = "敏感数据";
string password = "my-secret-password";
// 加密
string encrypted = AESHelper.Encrypt(plainText, password);
// 解密
string decrypted = AESHelper.Decrypt(encrypted, password);
Console.WriteLine($"原文: {plainText}");
Console.WriteLine($"加密: {encrypted}");
Console.WriteLine($"解密: {decrypted}");
using SAEA.Common.Encryption;
// 字符串 MD5
var hash1 = MD5Helper.GetStringMd5("hello world");
// 文件 MD5
var hash2 = MD5Helper.GetFileMd5(@"C:\file.txt");
// 流 MD5
using var stream = File.OpenRead(@"C:\file.txt");
var hash3 = MD5Helper.GetStreamMd5(stream);
using SAEA.Common.Encryption;
string text = "这是一段需要压缩的长文本...";
// 压缩
byte[] compressed = GZipHelper.Compress(text);
// 解压
string original = GZipHelper.Decompress(compressed);
// Deflate 压缩(另一种算法)
byte[] deflated = GZipHelper.DeflateCompress(text);
string original2 = GZipHelper.DeflateDecompress(deflated);
using SAEA.Common;
// GET 请求
var html = await HttpClientHelper.GetAsync("https://api.example.com/data");
// POST JSON
var data = new { Name = "张三", Age = 25 };
var result = await HttpClientHelper.PostJsonAsync("https://api.example.com/post", data);
// 带请求头
var headers = new Dictionary<string, string>
{
{ "Authorization", "Bearer token123" },
{ "Content-Type", "application/json" }
};
var response = await HttpClientHelper.PostJsonAsync("https://api.example.com/post", data, headers);
using SAEA.Common;
var apiHelper = new ApiHelper();
// GET 请求
apiHelper.Get("https://api.example.com/data", (response) =>
{
Console.WriteLine($"响应: {response}");
});
// POST 请求
apiHelper.Post("https://api.example.com/post", jsonData, (response) =>
{
Console.WriteLine($"响应: {response}");
});
using SAEA.Common.IO;
// 同步写入
FileHelper.Write("file.txt", "Hello World");
// 同步读取
var content = FileHelper.Read("file.txt");
// 异步写入
await FileHelper.WriteAsync("file.txt", "Hello World");
// 异步读取
var content2 = await FileHelper.ReadAsync("file.txt");
// 追加内容
FileHelper.Append("file.txt", "\n追加的内容");
// 异步追加
await FileHelper.AppendAsync("file.txt", "\n更多内容");
using SAEA.Common;
// 异步日志(自动写入文件)
LogHelper.Info("普通信息日志");
LogHelper.Warn("警告信息日志");
LogHelper.Debug("调试信息日志");
LogHelper.Error("错误信息日志");
LogHelper.Error("异常日志", exception);
// 控制台彩色输出
ConsoleHelper.WriteLine("成功信息", ConsoleColor.Green);
ConsoleHelper.WriteLine("警告信息", ConsoleColor.Yellow);
ConsoleHelper.WriteLineError("错误信息", ConsoleColor.Red);
using SAEA.Common;
public class AppConfig
{
public string ServerIP { get; set; } = "127.0.0.1";
public int Port { get; set; } = 8080;
public bool EnableSSL { get; set; } = false;
}
// 创建配置对象(自动加载或创建)
var config = new ConfigHelper<AppConfig>();
// 修改配置
config.Instance.ServerIP = "192.168.1.100";
config.Instance.Port = 9000;
config.Instance.EnableSSL = true;
// 保存到文件(AppConfig.json)
config.Save();
// 重新加载
config.Read();
using SAEA.Common;
// 深拷贝(反射方式)
var copy1 = originalObject.DeepCopy();
// 表达式树高性能复制(推荐)
var copy2 = FastCopy<User, User>.Copy(originalObject);
// 不同类型间属性映射
public class UserEntity { public string Name { get; set; } }
public class UserDto { public string Name { get; set; } }
var entity = new UserEntity { Name = "张三" };
var dto = ModelCloneHelper.Copy<UserDto>(entity);
using SAEA.Common;
// 获取当前时间戳(秒)
var timestamp = DateTimeHelper.GetTimestamp();
// 时间戳转日期
var date = DateTimeHelper.FromTimestamp(timestamp);
// UTC 时间转换
var utc = DateTimeHelper.ToUTC(DateTime.Now);
var local = DateTimeHelper.ToLocal(DateTime.UtcNow);
// 格式化输出
var formatted = DateTimeHelper.ToString(DateTime.Now, "yyyy-MM-dd HH:mm:ss");
| 包名 | 版本 | 说明 |
|---|---|---|
| protobuf-net | 3.2.56 | Protobuf 序列化 |
| Nito.AsyncEx | 5.1.2 | 异步编程增强 |
| System.IO.Pipelines | 10.0.2 | 高性能 IO 管道 |
| System.Threading.Channels | 10.0.2 | 线程安全通道 |
| System.Memory | 4.6.3 | 内存优化 |
Apache License 2.0
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 was computed. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 5 NuGet packages that depend on SAEA.Common:
| Package | Downloads |
|---|---|
|
SAEA.Sockets
SAEA.Socket is a high-performance IOCP framework based on.dotnet standard 2.0; Src contains its application test scenarios, such as websocket,rpc, redis driver, MVC WebAPI, lightweight message server, ultra large file transmission, etc. SAEA.Socket是一个高性能IOCP框架,基于.dotnet standard 2.0;Src中含有其应用测试场景,例如websocket、rpc、redis驱动、MVC WebAPI、轻量级消息服务器、超大文件传输等 https://github.com/yswenli/SAEA |
|
|
SAEA.Http
This is a web component based on SAEA.Sockets. It is lightweight, high performance, easy to use and self hosting. 这是一个基于SAEA.Sockets的web组件,轻量高性能,使用简便,自宿主。https://github.com/yswenli/SAEA/tree/master/Src/SAEA.HttpTest。 |
|
|
SAEA.MVC
This is a web component based on SAEA.Sockets. It is lightweight, high performance, easy to use and self hosting. 这是一个基于SAEA.Sockets的web组件,轻量高性能,使用简便,自宿主。https://github.com/yswenli/SAEA/tree/master/Src/SAEA.MVCTest。 |
|
|
SAEA.RedisSocket
This is a high-performance redis driver based on SAEA.Sockets, supporting redis cluster. 这是一个基于SAEA.Sockets的redis 高性能驱动,支持redis cluster https://github.com/yswenli/SAEA |
|
|
SAEA.WebSocket
This is a websocket server and client component based on SAEA.Socket. 这是基于SAEA.Socket的websocket服务器、客户端组件 https://github.com/yswenli/SAEA |
Showing the top 1 popular GitHub repositories that depend on SAEA.Common:
| Repository | Stars |
|---|---|
|
yswenli/GFF
GFF is a imitation QQ communication project, based on high IOCP. GFF是模仿QQ通讯项目,通信基于SAEA.MessageSocket、SAEA.Http、SAEA.MVC实现
|
| Version | Downloads | Last Updated |
|---|---|---|
| 26.4.23.1 | 658 | 4/23/2026 |
| 26.4.22.1 | 574 | 4/21/2026 |
| 7.26.4.21 | 579 | 4/20/2026 |
| 7.26.4.20 | 586 | 4/20/2026 |
| 7.26.2.2 | 607 | 2/2/2026 |
| 7.26.1.27 | 614 | 1/27/2026 |
| 7.26.1.25 | 649 | 1/25/2026 |
| 7.25.2.19 | 1,321 | 2/19/2025 |
| 7.25.2.18 | 757 | 2/18/2025 |
| 7.25.2.13 | 744 | 2/13/2025 |
| 7.25.2.11 | 796 | 2/11/2025 |
| 7.24.8.4 | 835 | 8/4/2024 |
| 7.23.9.24 | 1,487 | 9/24/2023 |
| 7.0.3.19 | 2,413 | 3/19/2023 |
| 7.0.0.3 | 8,117 | 2/27/2022 |
| 7.0.0.2 | 2,865 | 12/5/2021 |
| 7.0.0.1 | 2,690 | 11/28/2021 |
| 6.2.6.7 | 4,282 | 9/19/2021 |
| 6.2.6.6 | 3,107 | 8/15/2021 |
| 6.2.6.5 | 2,958 | 8/10/2021 |
SAEA. Common is a tool class project in the SAEA project
SAEA.Common 是SAEA项目中的工具类项目