CodeWF.Toolkit.Image
1.0.0.6
dotnet add package CodeWF.Toolkit.Image --version 1.0.0.6
NuGet\Install-Package CodeWF.Toolkit.Image -Version 1.0.0.6
<PackageReference Include="CodeWF.Toolkit.Image" Version="1.0.0.6" />
<PackageVersion Include="CodeWF.Toolkit.Image" Version="1.0.0.6" />
<PackageReference Include="CodeWF.Toolkit.Image" />
paket add CodeWF.Toolkit.Image --version 1.0.0.6
#r "nuget: CodeWF.Toolkit.Image, 1.0.0.6"
#:package CodeWF.Toolkit.Image@1.0.0.6
#addin nuget:?package=CodeWF.Toolkit.Image&version=1.0.0.6
#tool nuget:?package=CodeWF.Toolkit.Image&version=1.0.0.6
CodeWF.Toolkit
一组无 UI 依赖的 .NET 基础设施库合集:工具扩展、文件与图片处理、日志、事件总线与网络通信,均以 CodeWF.Toolkit.* 前缀发布。
A collection of UI-independent .NET infrastructure libraries: tool extensions, file/image processing, logging, event bus and network communication, published with the CodeWF.Toolkit.* prefix.
适用场景 / Typical scenarios
| 场景 | 用到的包 |
|---|---|
进程内解耦:发布订阅、Command/Query、[EventHandler] 扫描注册 |
CodeWF.Toolkit.EventBus(可选 Prism / ASP.NET Core 集成) |
| 跨进程消息:TCP 分布式总线,心跳保活、断线重连、离线消息补发 | CodeWF.Toolkit.EventBus.Socket |
| 文件批处理:Json/Yaml/Csv/Excel 读写、7z 压缩解压、App.config | CodeWF.Toolkit.Files |
| 图片批处理:缩放/水印/格式转换、多尺寸 ico 合成拆分、条码二维码 | CodeWF.Toolkit.Image |
| 统一日志:控制台 + 文件轮转 + UI 事件流,可桥接 Microsoft.Extensions.Logging | CodeWF.Toolkit.Logging、CodeWF.Toolkit.Logging.Microsoft |
| 二进制协议:特性声明字段布局的 AOT 友好序列化 + TCP/UDP 封装(含远程文件系统与断点续传) | CodeWF.Toolkit.NetWeaver、CodeWF.Toolkit.NetWrapper |
| 桌面应用基础设施:应用数据目录迁移、GitHub Release 更新检查、常用扩展方法 | CodeWF.Toolkit.Core |
包一览 / Packages
所有包均面向 net10.0。「依赖」列中的本仓包由包依赖自动带入,无需单独安装。
| 包 | 说明 | 依赖 |
|---|---|---|
| CodeWF.Toolkit.Core | .NET 原生功能扩展:字符串/日期/枚举/正则等 + 应用数据目录 + GitHub Release 更新检查 | 零第三方依赖 |
| CodeWF.Toolkit.Files | 文件操作集合:Json/Yaml/Csv/Excel 读写、7z 压缩、App.config | SharpCompress、YamlDotNet、CsvHelper、MiniExcel、System.Configuration.ConfigurationManager |
| CodeWF.Toolkit.Image | 图片处理集合:Magick.NET 缩放/水印/格式转换 + ZXing 条码二维码 | Magick.NET-Q16-AnyCPU、ZXing.Net.Bindings.Magick |
| CodeWF.Toolkit.Logging | 轻量日志核心:控制台输出、文件轮转、UI 日志事件 | Microsoft.Extensions.Logging.Abstractions(唯一依赖,无其它第三方库) |
| CodeWF.Toolkit.Logging.Microsoft | Microsoft.Extensions.Logging 提供程序,把 MEL 日志接入轻量核心 | Microsoft.Extensions.{DependencyInjection.Abstractions, Hosting.Abstractions, Logging, Logging.Configuration, Options} + 本仓 Logging |
| CodeWF.Toolkit.EventBus | 轻量进程内事件总线:Command/Query、[EventHandler] 特性、IOC 扫描注册 |
零第三方依赖 |
| CodeWF.Toolkit.EventBus.Prism | Prism 容器集成 | Prism.Core、DryIoc.dll + 本仓 EventBus |
| CodeWF.Toolkit.EventBus.AspNetCore | ASP.NET Core 集成 | FrameworkReference Microsoft.AspNetCore.App + 本仓 EventBus |
| CodeWF.Toolkit.EventBus.Socket | 基于 TCP 的分布式事件总线:Pub/Sub、Query/Response、心跳重连、离线补发,不依赖第三方 MQ | 本仓 EventBus、NetWrapper |
| CodeWF.Toolkit.NetWeaver | AOT 友好的 TCP/UDP 数据包二进制序列化核心 | 零第三方依赖 |
| CodeWF.Toolkit.NetWrapper | TCP/UDP 通信封装与命令分发,含远程文件系统与断点续传 | 本仓 NetWeaver、EventBus、Logging |
快速开始 / Quick start
dotnet add package CodeWF.Toolkit.Core
dotnet add package CodeWF.Toolkit.EventBus
dotnet add package CodeWF.Toolkit.Logging
日志(CodeWF.Toolkit.Logging)
using CodeWF.Toolkit.Logging;
Logger.TryInitialize(new LoggerOptions
{
MinimumLevel = LogLevel.Information,
EnableConsole = true,
File = new FileLogOptions
{
DirectoryPath = Path.Combine(AppContext.BaseDirectory, "logs"),
MaxFileSizeBytes = 32 * 1024 * 1024,
RetentionDays = 30,
},
});
Logger.Info("服务已启动");
Logger.Error("处理失败", ex);
await Logger.ShutdownAsync(); // 退出前刷盘
需要把 MEL 生态的日志也收进来时,加装 CodeWF.Toolkit.Logging.Microsoft:builder.Logging.AddCodeWFLogger(options => { /* 同 LoggerOptions */ });
事件总线(CodeWF.Toolkit.EventBus)
using CodeWF.Toolkit.EventBus;
var bus = new EventBus();
bus.Subscribe<GreetCommand>(cmd => Console.WriteLine(cmd.Name));
await bus.PublishAsync(new GreetCommand("hi"));
var query = new TimeQuery();
bus.Subscribe(new TimeQueryHandler()); // 含 [EventHandler] 方法的处理器
bus.Query(query);
序列化往返(CodeWF.Toolkit.NetWeaver)
[NetHead(0x01, 1)]
public sealed class SamplePacket : INetObject
{
[NetFieldOrder(0)] public int Id { get; set; }
[NetFieldOrder(1)] public string Title { get; set; } = string.Empty;
}
var buffer = packet.Serialize(systemId: 0);
var restored = buffer.Deserialize<SamplePacket>();
TCP 收发(CodeWF.Toolkit.NetWrapper)
using CodeWF.Toolkit.NetWrapper.Helpers;
var server = new TcpSocketServer();
await server.StartAsync("demo-server", "127.0.0.1", 39561);
var client = new TcpSocketClient();
await client.ConnectAsync("demo-server", "127.0.0.1", 39561);
await client.SendCommandAsync(packet);
远程文件系统(浏览/上传/下载/断点续传)见 CodeWF.Toolkit.NetWrapper.FileSystem 的 TcpSocketClientFileSystemFeature。
文件与图片(CodeWF.Toolkit.Files / CodeWF.Toolkit.Image)
using CodeWF.Toolkit.Core.FileExtensions; // SevenZipCompressor
using CodeWF.Toolkit.Files.Extensions; // ToJson / ToYaml
using CodeWF.Toolkit.Image; // ImageHelper / QrCodeGenerator
var yaml = student.ToYaml(out var error);
var compressor = new SevenZipCompressor(httpClient);
compressor.Zip(sourceDirectory, "out.zip");
compressor.Decompress("out.zip", destinationDirectory);
await ImageHelper.MergeGenerateIcon("logo.png", "logo.ico", [24, 32, 48]);
QrCodeGenerator.GenerateQrCode("CodeWF", "https://codewf.com", "qr.png");
更新检查(CodeWF.Toolkit.Core)
using CodeWF.Toolkit.Core.UpdateChecking;
var checker = new UpdateChecker("dotnet9", "CodeWF.Toolkit");
var result = await checker.CheckAsync(new Version(1, 0, 0, 0));
与 CodeWF.Avalonia 的关系 / Relationship with CodeWF.Avalonia
CodeWF.Avalonia.Log(日志查看控件与桌面通知)配套本仓的CodeWF.Toolkit.Logging:控件订阅核心的 UI 日志事件流,日志回调在后台线程,界面侧自行调度到 UI 线程。- 两个仓库各自带演示程序:本仓
demo/下是控制台演示与 Avalonia 图形演示台,CodeWF.Avalonia仓的演示台展示的是控件与主题。 - UI 相关能力一律留在
CodeWF.Avalonia.*;本仓保持无 UI 依赖。
依赖与目标框架 / Dependencies and AOT
全部库项目面向 net10.0,Directory.Packages.props 集中管理版本。Native AOT/裁剪注意点:
| 包 | 注意点 |
|---|---|
| NetWeaver | 反射式 DTO 序列化:SerializeHelper 通过 DynamicallyAccessedMembers / UnconditionalSuppressMessage 声明保留要求,裁剪时需保留被序列化 DTO 的公共属性。 |
| Files | JsonExtensions 的反射重载标记 RequiresUnreferencedCode,AOT 请改用 JsonTypeInfo<T> 重载;AppConfigHelper 基于 System.Configuration.ConfigurationManager,同标记,AOT 请改用文件路径重载。 |
| Core | EnumExtension、ValidationExtension、IConvertibleExtensions 中读取特性的方法标记 RequiresUnreferencedCode,AOT 下请使用显式映射或手写转换。 |
| Image | Magick.NET 携带原生二进制(Q16-AnyCPU),包体积较大,请按需独立引用而非并入聚合包。 |
| Logging | 文件写入为批量异步,崩溃前请调用 Logger.ShutdownAsync();UI 事件回调在后台线程触发。 |
CI 的 aot-smoke 作业会对控制台演示与 Avalonia 演示台做 PublishAot=true 发布并运行 --smoke。
包 → 源码 → 文档索引 / Source & docs index
| 包 | 源码 | 文档 |
|---|---|---|
| Core | src/Core | 说明文档 |
| Files | src/Files | 说明文档 |
| Image | src/Image | 说明文档 |
| Logging / Logging.Microsoft | src/Logging | 说明文档 |
| EventBus 系列(含 Prism / AspNetCore / Socket) | src/EventBus | 说明文档 |
| NetWeaver / NetWrapper | src/Net | 说明文档 |
演示 / Demos
Demo 保留 Ribbon + Dock,按核心扩展、系统与文件、数据与图像、事件与集成、协议与网络、日志与观测分类;每个主菜单对应一个帮助类,49 个页面按类名查找,组合工作流集中到“综合示例”。详见 原生 Demo 文档。





The Ribbon and Dock demo groups APIs by function, with one helper class per primary menu entry. Composite workflows are in the final category. Its UI libraries come from NuGet; cloning CodeWF.Toolkit alone is sufficient to build the GUI and console demos.
# 控制台演示:依次跑日志、进程内总线、分布式总线、序列化,然后进入交互菜单
dotnet run --project demo/CodeWF.Toolkit.Demo
# 冒烟模式:跑完全部演示直接退出,退出码 0 表示通过(CI / AOT 冒烟使用)
dotnet run --project demo/CodeWF.Toolkit.Demo -- --smoke
# Avalonia 图形演示台:同款能力以界面方式逐页演示
dotnet run --project demo/CodeWF.Toolkit.Demo.Avalonia
# 冒烟模式:逐页构建后逐色板渲染一遍再退出,退出码 0 表示全部通过(CI / AOT 冒烟使用)
dotnet run --project demo/CodeWF.Toolkit.Demo.Avalonia -- --smoke
图形演示台的安装包由 GitHub Releases 提供(随 v* tag 构建):Windows setup.exe / 便携 zip、Linux deb、macOS dmg,均附 .sha256 校验文件。控制台演示以源码运行,不作为安装包分发。
许可与贡献 / License and contributing
MIT。Issue 与 PR 都欢迎,提交前请确保 dotnet build CodeWF.Toolkit.slnx -c Release 与 dotnet test 通过。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Magick.NET-Q16-AnyCPU (>= 14.17.1)
- ZXing.Net.Bindings.Magick (>= 0.16.18)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.