Kok.Toolkit.Core 1.1.0

dotnet add package Kok.Toolkit.Core --version 1.1.0
                    
NuGet\Install-Package Kok.Toolkit.Core -Version 1.1.0
                    
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="Kok.Toolkit.Core" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Kok.Toolkit.Core" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Kok.Toolkit.Core" />
                    
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 Kok.Toolkit.Core --version 1.1.0
                    
#r "nuget: Kok.Toolkit.Core, 1.1.0"
                    
#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 Kok.Toolkit.Core@1.1.0
                    
#: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=Kok.Toolkit.Core&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Kok.Toolkit.Core&version=1.1.0
                    
Install as a Cake Tool

Kok.Toolkit

介绍

Kok.Toolkit 是一个基于 .NET 6 的通用工具类库,封装了二进制序列化、校验码计算、日志记录、通信器、定时器、文件操作、进程管理等多种常用功能,同时提供了适用于 WPF 和 Avalonia 框架的 MVVM 基础设施。

解决方案下包含了存放源码的 src 目录和存放测试代码的 test 目录。

项目 NuGet 版本 说明
Kok.Toolkit.Core 1.0.23 提供通用工具类:二进制序列化/反序列化、CRC/汉明码校验、日志记录、UDP 通信器、进程间通信、定时器、CSV 文件、网络工具等;也提供了若干常用的类型扩展方法
Kok.Toolkit.Wpf 1.0.1 基于 CommunityToolkit.Mvvm 实现了 WPF 下的 MVVM,提供了视图模型基类、对话框服务、导航服务,并封装了通用 WpfHost;也提供了若干常用的控件和转换器
Kok.Toolkit.Avalonia 1.0.5.7 基于 CommunityToolkit.Mvvm 实现了 Avalonia 下的 MVVM,提供了视图模型基类、对话框服务、MessageBox、窗体消息总线,并封装了通用 AvaloniaHost

Kok.Toolkit.Core

目标框架:net6.0

二进制序列化/反序列化

BinarySerializer 支持对所有基元类型、类、结构体、字典、列表集合(一元泛型列表集合)、byte[] 数组的二进制序列化和反序列化。支持指定序列化顺序、大小端编码、字符串编码,并可通过特性自动计算 CRC 校验和。

基本用法
// 基本类型
int data = 1234;
BinarySerializer.Serialize(data, out var bytes, out var error);
BinarySerializer.Deserialize<int>(bytes, out var d1, out var message);

// 字符串(序列化时在数据前自动附加 4 字节长度头)
string str = "Hello World";
BinarySerializer.Serialize(str, out var bytes2, out _);
BinarySerializer.Deserialize<string>(bytes2, out var s1, out _);
对象序列化
public class TestMessage<T> where T : class, new()
{
    public byte Header { get; set; }
    public T? Data { get; set; }
}

public class CmdData
{
    public byte Type { get; set; }
    public int SourceId { get; set; }
    public int Count { get; set; }

    [CollectionItemCount(nameof(Count))]  // 关联 Count 属性作为集合长度,不再额外写入 4 字节长度
    public List<byte>? StateList { get; set; }
}

var data = new TestMessage<CmdData>();
BinarySerializer.Serialize(data, out var bytes, out _);
BinarySerializer.Deserialize<TestMessage<CmdData>>(bytes, out var result, out _);
自定义编码

默认使用大端字节序、UTF-8 字符串编码。如需自定义,可通过构造函数指定:

using var serializer = new BinarySerializer(new MemoryStream(), Encoding.UTF8, isLittleEndian: true);

也可直接在类上使用 [BinaryEncoding] 特性:

[BinaryEncoding]   // 使用默认值:UTF8 + 大端
public class MyMessage { ... }
序列化特性一览
特性 说明
BinaryIgnoreAttribute 序列化/反序列化时忽略该属性
BinaryEncodingAttribute 在类或结构体上指定整体编码格式(字符串编码 + 大小端)
FieldOrderAttribute 指定属性的序列化顺序(升序)
CollectionByteLengthAttribute 标识集合的字节长度(可关联属性或写死数值),声明后不再额外生成 4 字节长度头
CollectionItemCountAttribute 标识集合的元素数量(可关联属性或写死数值),声明后不再额外生成 4 字节长度头
SlicesNumberAttribute 标识集合的切片数量,支持多级属性路径
NumericalRangeAttribute 标识属性的有效数值范围
CrcStartByteAttribute 标识从该属性所在字节开始计算 CRC(适用于报文存在多个 CRC 段的场景)
CrcAttribute 标识该属性存储 CRC 校验值,可指定 CRC 算法
FcsAttribute 标识帧校验序列(FCS)属性及使用的算法名称
ByteSequenceAttribute 标注属性的字节偏移和字节长度(仅用于说明,不影响序列化行为)

CRC 校验

均使用查表法实现,计算速度快。

CRC8
算法 多项式 初始值 结果异或值 输入反转 输出反转
Standard 0x07 0x00 0x00 false false
ITU 0x07 0x00 0x55 false false
ROHC 0x07 0xFF 0x00 true true
MAXIM 0x31 0x00 0x00 true true
CRC16
算法 多项式 初始值 结果异或值 输入反转 输出反转
IBM 0x8005 0x0000 0x0000 true true
MAXIM 0x8005 0x0000 0xFFFF true true
USB 0x8005 0xFFFF 0xFFFF true true
MODBUS 0x8005 0xFFFF 0x0000 true true
CCITT 0x8005 0x0000 0x0000 true true
CCITT-FALSE 0x8005 0xFFFF 0x0000 false false
X25 0x1021 0xFFFF 0xFFFF false false
YMODEM 0x1021 0x0000 0x0000 false false
DNP 0x3D65 0x0000 0xFFFF true true
CRC32
算法 多项式 初始值 结果异或值 输入反转 输出反转
Standard 0x4C11DB7 0xFFFFFFFF 0xFFFFFFFF true true
StandardFalse 0x4C11DB7 0x00000000 0x00000000 false false
MPEG2 0x4C11DB7 0xFFFFFFFF 0x00000000 false false
CRC32C(Castagnoli)

额外提供 Crc32c 实现(多项式 0x1EDC6F41),适用于 iSCSI、SCTP 等场景。

var crc = CRC.Compute(Crc16.Algorithm.MODBUS, data);

汉明码

提供 (8,4) 汉明码的编解码,支持单比特错误自动纠正。

// 编码(取低4位)
byte encoded = HammingCode.Encode84(data, isLowNibble: true);

// 解码,返回错误位位置(0 表示无错)和原始半字节数据
var (errorBit, original) = HammingCode.Decode84(encoded);

FFFE 协议编解码

基于帧头 0xFF 0xFE、帧尾 0xFF 0xFD 的帧同步协议,用于串行或 UDP 等字节流场景下的拆包/组包。

var state = FrameState.WaitHeadFlag;
bool isComplete = FffeEncoding.Unpack(data, ref state, out byte[] frame, out Span<byte> rest);

通信器

报文收发器(Transceiver)

基于 UdpClient 实现,支持定时或定次向多个目标发送强类型报文,同时接收并反序列化收到的报文。内部自动处理序列化与反序列化,调用方只需提供报文生成逻辑和接收处理逻辑。

支持最多 3 种强类型报文的混合收发(Transceiver<T1>、Transceiver<T1,T2>、Transceiver<T1,T2,T3>)。

var transceiver = new Transceiver<MyTelegram>();

// 创建周期发报机(每 1000ms 发送一次)
var builder = TransmitterBuilder<MyTelegram>.CreateCyclical(
    new List<TargetEndPoint> { new("目标1", new IPEndPoint(IPAddress.Loopback, 8090), null) },
    1000,
    MakeMessage,
    "发报机1");

transceiver.SetTransmitter(builder);
transceiver.SetReceiver(OnGotTelegram);

if (transceiver.Start("127.0.0.1", 8081, "收发器1"))
    Console.WriteLine("成功启动");

// 生成报文
static List<MyTelegram> MakeMessage(object? _)
    => new() { new MyTelegram(1, "hello") };

// 处理收到的报文
static void OnGotTelegram(Packet pkt, object? _)
    => Console.WriteLine($"收到来自 {pkt.SourceAddress}:{pkt.SourcePort} 的报文");
响应式通信器(ReactiveCommunicator)

收到报文后立即根据报文内容自动发送回应报文,适用于请求-应答类协议。

var comm = new ReactiveCommunicator(
    receiveAction: pkt => true,           // 是否需要回应
    generateAck: raw => BuildAck(raw));   // 生成回应报文

comm.Start("127.0.0.1", 9000);
进程间通信器(ProcessCommunicator)

通过非持久化共享内存(MemoryMappedFile)在进程间交换数据,仅支持 Windows 平台。

// 服务端:创建共享内存,写入数据
var server = new ProcessCommunicator("MySharedMem", 1024);
server.CreateSharedMemory(out _);
server.WriteSharedMemory(0, 0, data, out _);

// 客户端:读取数据
var client = new ProcessCommunicator("MySharedMem", 1024);
client.ReadSharedMemory<MyStruct>(0, 0, out var result, out _);

日志

以 Tracker 为统一入口,支持多个日志处理器并存,静态全局调用,线程安全。

// 记录全局未处理异常(可选)
Tracker.LogUnhandledException();

// 写日志
Tracker.WriteInfo("应用启动");
Tracker.WriteWarn("配置文件缺失,使用默认值");
Tracker.WriteError("连接失败");
内置日志处理器
类型 说明
FileLog 文本文件日志,支持按日期/级别/大小分文件,支持最大文件数和单文件大小限制
LevelLog 按日志级别分别输出到独立文件(内部使用多个 FileLog)
ConsoleLog 控制台彩色输出,不同级别对应不同前景色
ExternalOutputLog 将日志转发给自定义异步委托,便于集成到 UI 或外部系统

可同时注册多个处理器:

Tracker.AddLogger(new ConsoleLog());
Tracker.AddLogger(new FileLog());
Tracker.AddLogger(new ExternalOutputLog(msg => DisplayAsync(msg)));

日志级别支持通过 logger.json 配置文件统一配置:

级别 说明
Debug 调试信息
Info 一般信息
Warn 警告
Error 错误
Fatal 致命错误

定时器

防重入定时器(AntiReTimer)

基于 System.Threading.Timer 封装,天然防止回调重入。支持无限循环或固定次数执行。

// 每 500ms 执行一次,无限循环
var timer = new AntiReTimer(DoWork, state: null, period: 500);

// 执行固定次数
var timer2 = new AntiReTimer(
    isResetCounter: () => needReset,
    action: DoWork,
    state: null,
    period: 1000,
    runTimes: 10);

timer.Stop();
多媒体定时器(MultimediaTimer)

调用 Windows winmm.dll 多媒体接口,可实现 1ms 精度的高精度定时,仅支持 Windows 平台。

// 每 1ms 触发一次
var mmTimer = new MultimediaTimer(DoWork, state: null, period: 1);
mmTimer.Stop();

网络工具(Network)

// 解析终结点
Network.TryParseEndPoint("192.168.1.1", 8080, out var endPoint);

// 检测端口是否已被占用
bool used = endPoint.CheckPort(NetworkProtocol.Udp);

// 获取本机所有在用 IP 地址
var ips = Network.LocalIps;

CSV 文件

using var csv = new CsvFile("data.csv");

// 逐行读取
string[]? row;
while ((row = csv.ReadLine()) != null)
{
    // 处理每一行
}

// 一次读取全部行
string[][] allRows = csv.ReadAll();

进程管理(ProcessManager)

// 启动进程
var (ok, error, process) = ProcessManager.Start("app.exe", "--config=dev", onExited: null);

// 停止进程
ProcessManager.Stop(process);
ProcessManager.Stop(pid);

几何计算(Calculator)

// 计算三点夹角(余弦定理)
double angle = Calculator.Angle(cx, cy, x1, y1, x2, y2);

// 计算45度过渡点
var (ok, px, py) = Calculator.TransitionPoint45(cx, cy, x1, y1, x2, y2);

// 角度转弧度
double radian = 45.0.ToRadianFromAngle();

观察者模型

提供对 .NET IObservable<T> / IObserver<T> 接口的基类封装,简化发布-订阅模式实现。

// 可被观察对象继承 ObservableBase<T>
public class DataSource : ObservableBase<int>
{
    public void Push(int value) => Notify(value);
}

// 观察者继承 ObserverBase<T>
public class DataConsumer : ObserverBase<int>
{
    public override void OnNext(int value) => Console.WriteLine(value);
}

扩展方法

字符串扩展(StringExtension)
方法 说明
IsEmpty() 判断字符串是否为空或空白
ToInt() 安全转换为 int(失败返回 0)
ToUint() 安全转换为 uint(失败返回 0)
TrimEmpty() 移除所有空白字符
TryToHexArray() 16 进制字符串转 byte[]
TrimEnd(params string[]) 从尾部移除指定字符串
集合扩展(CollectionExtension)
方法 说明
ToString<T>(separator, format...) 将集合按格式拼接为字符串
ToByteArray(isHex) 字符串数组转换为 byte[](支持十六进制)
数值扩展(ValueExtension)

提供 byte、ushort、uint、ulong 的按位反转(ReverseBit)、按字节反转(ReverseByte)、按字节反转补码(ReverseComplementByte)等操作;以及 GetBitValue、SetBitValue 等位操作方法。

时间扩展(DateTimeExtension / TimeStampUtil)
方法 说明
ToTimeStamp() DateTime → 10 位 UTC 时间戳(秒)
ToLongTimeStamp() DateTime → 13 位 UTC 时间戳(毫秒)
ToLocalTimeStamp() DateTime → 10 位本地时间戳(秒)
TimeStampUtil.TimeStampToLocalTime() 10 位时间戳 → 本地 DateTime
TimeStampUtil.LongTimeStampToLocalTime() 13 位时间戳 → 本地 DateTime
枚举扩展(EnumExtension)
// 获取枚举值的 DescriptionAttribute 文本
string desc = MyEnum.Value.GetDescription();
其他扩展
  • TaskExtension.WaitAsync(expression) — 异步等待,直到表达式为 true
  • AssemblyExtension — 程序集反射相关
  • TypeExtension — 类型名称到 Type 的查找
  • UdpClientExtension — UdpClient 便捷扩展(如 SetIOControl)

Kok.Toolkit.Wpf

目标框架:net6.0-windows
依赖:CommunityToolkit.Mvvm 8.2.2、Microsoft.Extensions.Hosting 8.0

WpfHost(Generic Host 集成)

将 WPF 应用接入 .NET Generic Host,获得依赖注入、配置、托管服务等能力:

// App.xaml.cs
var host = new WpfHost(args)
    .AddJsonConfiguration("appsettings.json")
    .ConfigureServices(services =>
    {
        services.AddSingleton<MainWindow>();
        services.AddSingleton<IDialogService, DialogService>();
        services.AddSingleton<INavigationService, NavigationService>();
        // 注册视图和视图模型...
    });

await host.StartAsync();
host.Run<MainWindow>(args);

ViewModel 基类

继承 CommunityToolkit.Mvvm 的 ObservableObject,提供属性变更通知基础。直接在项目中继承使用:

public class MainViewModel : ViewModel
{
    [ObservableProperty]
    private string _title = "Hello";
}

对话框服务(IDialogService / DialogService)

支持非模态弹窗、模态弹窗(带/不带参数、带/不带回调):

// 非模态
_dialogService.Show<SettingsWindow>();

// 模态(等待关闭结果)
bool? result = await _dialogService.ShowDialogAsync<ConfirmWindow>();

// 带参数的模态弹窗
await _dialogService.ShowDialogAsync<EditWindow>(parameter, callback: vm => Save(vm));

导航服务(INavigationService / NavigationService)

在主容器中通过 CurrentView 属性切换 UserControl 实现页面导航,支持导航离开/进入拦截:

// 按视图类型导航
_navigationService.ToView<HomeView>();

// 按视图模型类型导航(视图名 = ViewModel 名去掉 "ViewModel" 后缀 + "View")
_navigationService.ToViewModel<HomeViewModel>();

控件

控件 说明
AutoSizeCanvas 继承自 Canvas,其测量尺寸自动适应子元素的最大宽高

转换器

转换器 说明
BoolToVisibilityConverter bool ↔ Visibility,支持通过 ConverterParameter 反转逻辑

Kok.Toolkit.Avalonia

目标框架:net6.0
依赖:Avalonia 11.1.3、CommunityToolkit.Mvvm 8.3.2、MessageBox.Avalonia 3.1.6、Microsoft.Extensions.Hosting 8.0

AvaloniaHost(Generic Host 集成)

通过 AvaloniaHostBuilder 将 Avalonia 应用接入 .NET Generic Host:

// Program.cs
var builder = new AvaloniaHostBuilder(args)
    .AddJsonConfiguration("appsettings.json")
    .ConfigureServices((services, config) =>
    {
        services.AddSingleton<IDialogService, DialogService>();
        services.AddSingleton<INavigationService, NavigationService>();
        // 注册视图和视图模型...
    });

var host = builder.Build();
await host.StartAsync();

ViewModel 基类

与 WPF 版相同,继承 CommunityToolkit.Mvvm 的 ObservableObject。

对话框服务(IDialogService / DialogService)

// 弹出对话框
await _dialogService.ShowDialogAsync<EditWindow>(parameter);

// 带回调
await _dialogService.ShowDialogAsync<ConfirmWindow>(null, callback: vm => Confirm(vm));

导航服务(INavigationService / NavigationService)

与 WPF 版用法一致,内部针对 Avalonia 的 UserControl 实现。

MessageBox

基于 MessageBox.Avalonia 封装的静态方法,方便在 ViewModel 层调用:

// 信息提示
await MessageBox.InfoAsync("操作成功", "提示");

// 确认对话框
bool confirmed = await MessageBox.AskAsync("确定要删除吗?", "确认");

窗体消息总线(WindowMessenger)

基于 CommunityToolkit.Mvvm 的 WeakReferenceMessenger 实现 ViewModel → Window 的解耦消息通信:

// 在 Window.cs 中注册
WindowMessenger.ResponseCloseWinMessage<MainViewModel>(this);

// 带确认的关闭
WindowMessenger.ResponseCloseWinMessageWithConfirm<MainViewModel>(this, "确定关闭窗体吗?");

// 注册自定义消息
WindowMessenger.Register<MyViewModel, MyMessage>(this, msg => HandleMessage(msg));

// 在 ViewModel 中发送消息
WindowMessenger.Send(new CloseWindowMessage());

许可证

本项目遵循 LICENSE 中规定的许可协议。

Product Compatible and additional computed target framework versions.
.NET 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 was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Kok.Toolkit.Core:

Package Downloads
Kok.Toolkit.Avalonia

基于CommunityToolkit.Mvvm实现了Avalonia下的MVVM,提供了视图模型基类、对话框服务、导航服务、MessageBox,并封装了通用AvaloniaHost

Kok.Toolkit.Wpf

基于CommunityToolkit.Mvvm实现了WPF下的MVVM,提供了视图模型基类、对话框服务、导航服务,并封装了通用WPFHost,也提供了若干常用的转换器等

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.0 101 9/18/2026
1.0.25 84 9/18/2026
1.0.24 121 5/8/2026
1.0.23 118 3/24/2026
1.0.22 108 3/23/2026
1.0.21 117 3/17/2026
1.0.20 246 12/26/2025
1.0.19 211 9/10/2025
1.0.18 191 7/14/2025
1.0.17 185 7/4/2025
1.0.16 187 6/26/2025
1.0.15 169 6/21/2025
1.0.14 212 6/4/2025
1.0.13 240 4/3/2025
1.0.12 523 3/26/2025
1.0.11 165 2/8/2025
1.0.10 155 2/8/2025
1.0.9 168 2/7/2025
1.0.8 167 2/5/2025
1.0.7 217 10/17/2024
Loading failed