QianTools 2.3.5
dotnet add package QianTools --version 2.3.5
NuGet\Install-Package QianTools -Version 2.3.5
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="QianTools" Version="2.3.5" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="QianTools" Version="2.3.5" />
<PackageReference Include="QianTools" />
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 QianTools --version 2.3.5
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: QianTools, 2.3.5"
#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 QianTools@2.3.5
#: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=QianTools&version=2.3.5
#tool nuget:?package=QianTools&version=2.3.5
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
QianTools
.NET 工业自动化与系统管理工具库,支持 net6.0 / net8.0。
作者:钱军涛 | 公司:浪涛科技有限公司 | 许可证:MIT
安装
dotnet add package QianTools
项目结构
QianTools/
├── Core/ # 基础设施(日志、配置)
│ ├── LogManager.cs # 日志管理器(支持 ILogger 接口、级别过滤、文件滚动)
│ ├── ILogger.cs # 日志接口
│ ├── LogLevel.cs # 日志级别枚举
│ ├── ConfigManager.cs # 配置管理器(JSON/XML,策略模式可扩展)
│ ├── IConfigParser.cs # 配置解析器接口
│ ├── JsonParser.cs # JSON 解析器
│ └── XmlParser.cs # XML 解析器
├── Helpers/ # 通用工具类
│ ├── AllTools.cs # 统一外观入口(FileTools / CryptoTools / NetworkTools)
│ ├── CryptoHelper.cs # 加密与哈希(SHA256、MD5)
│ ├── FileHelper.cs # 文件/目录复制与删除
│ └── NetworkHelper.cs # HTTP 文件下载
├── System/ # 系统硬件信息
│ ├── SystemHardwareInfo.cs # 串口、磁盘、CPU、操作系统、网络适配器
│ └── MachineCodeGenerator.cs # 机器码生成与授权验证
├── Plc/ # PLC 通信
│ ├── MelsecPlcService.cs # 三菱 FX 底层通信服务(ASCII 协议)
│ └── MelsecPlcHelper.cs # 上层静态封装
├── Ezd/ # JCZ激光打标板卡控制
│ ├── EzdClient.cs # 高层封装(单例),生命周期/异步/业务级 API
│ ├── EzdNative.cs # P/Invoke 底层接口声明
│ └── EzdErrorCode.cs # 故障码定义与中文消息
├── Application/ # 应用层服务
│ ├── AutoStartManager.cs # 注册表开机自启动
│ ├── ShortcutCreator.cs # 桌面快捷方式
│ ├── VerifyInstallation.cs# 软件安装与验证
│ └── MesClient.cs # MES HTTP 客户端
├── QianTools.csproj
└── README.md
功能模块
功能模块
Core — 基础设施
日志管理 — LogManager
// 使用静态方法(默认单例)
LogManager.Info("设备启动成功");
LogManager.Error($"通信失败: {ex.Message}");
// 自定义日志路径和文件滚动
LogManager.Initialize(@"D:\AppLogs\myapp.log");
LogManager.MinLogLevel = LogLevel.Debug;
LogManager.MaxFileSizeBytes = 10 * 1024 * 1024; // 10MB 自动滚动
// 通过 ILogger 接口注入(支持单元测试)
ILogger logger = LogManager.Instance;
logger.LogInfo("消息");
配置管理 — ConfigManager
支持 JSON(默认)和 XML 两种格式,策略模式可扩展。
// ===== JSON 模式(默认) =====
var cfg = new ConfigManager(); // 或 ConfigManager.Default
cfg.Set("AppSettings", new AppSettings { Theme = "Dark" });
var settings = cfg.Get<AppSettings>("AppSettings"); // 从内存读取
cfg.Save(); // 持久化到文件
cfg.Load(); // 从文件加载到内存
cfg.Remove("AppSettings");
// ===== XML 模式 =====
var xmlCfg = new ConfigManager(useXml: true, customPath: @"D:\MyApp\Config");
xmlCfg.Set("AppSettings", new AppSettings { Theme = "Dark" });
xmlCfg.Save(); // → D:\MyApp\Config\config.xml
// ===== 错误监听 =====
ConfigManager.OnError += msg => Console.WriteLine(msg);
Helpers — 通用工具
统一入口 — AllTools
// 通过 AllTools 静态子类访问
AllTools.FileTools.CopyDirectory(@"C:\Source", @"D:\Backup", overwrite: true);
AllTools.FileTools.DeleteDirectory(@"C:\Temp\OldData");
string sha256 = AllTools.CryptoTools.ComputeSha256Hash("hello");
string md5 = AllTools.CryptoTools.ComputeMd5Hash("hello");
await AllTools.NetworkTools.DownloadFileAsync(url, destinationPath);
// Excel 操作
AllTools.ExcelTools.WriteToExcel(dataList, @"D:\data.xlsx", "Sheet1");
DataTable dt = AllTools.ExcelTools.ReadToDataTable(@"D:\data.xlsx");
List<MyClass> list = AllTools.ExcelTools.ReadToList<MyClass>(@"D:\data.xlsx");
文件操作 / 加密 / 网络 / Excel
// 文件
FileHelper.CopyDirectory(@"C:\Source", @"D:\Backup", overwrite: true);
FileHelper.DeleteDirectory(@"C:\Temp\OldData");
// 加密
string sha256 = CryptoHelper.ComputeSha256Hash("hello");
string md5 = CryptoHelper.ComputeMd5Hash("hello");
// 网络
await NetworkHelper.DownloadFileAsync("https://example.com/file.zip", @"D:\Download\file.zip");
// Excel(基于 ClosedXML,仅 .xlsx)
ExcelHelper.WriteToExcel(dataList, @"D:\data.xlsx", "Sheet1");
ExcelHelper.WriteDataTable(dataTable, @"D:\data.xlsx", "Sheet1");
DataTable dt = ExcelHelper.ReadToDataTable(@"D:\data.xlsx");
List<MyClass> list = ExcelHelper.ReadToList<MyClass>(@"D:\data.xlsx");
string[] sheets = ExcelHelper.GetSheetNames(@"D:\data.xlsx");
System — 系统信息
硬件信息 — SystemHardwareInfo
string ports = SystemHardwareInfo.GetPort(); // 串口列表
string disks = SystemHardwareInfo.GetDiskInfo(); // 磁盘信息
string cpu = SystemHardwareInfo.GetCpuInfo(); // CPU 信息
string os = SystemHardwareInfo.GetOsInfo(); // 操作系统
string network = SystemHardwareInfo.GetNetworkAdapterInfo(); // 网络适配器
机器码与授权 — MachineCodeGenerator
// 生成 24 位机器码(CPU + 硬盘 + 网卡)
string machineCode = MachineCodeGenerator.GenerateMachineCode();
string hash = MachineCodeGenerator.GetMachineCodeHash(); // SHA256 大写
// ── 无口令模式 ──
// 授权方生成注册码
string licenseKey = MachineCodeGenerator.GenerateLicenseKey(
machineCode, new DateTime(2026, 12, 31));
// 用户端验证(返回 LicenseResult,可解构为 tuple)
var (isValid, expiryDate) = MachineCodeGenerator.ValidateLicenseKey(licenseKey, machineCode);
// ── 口令保护模式 ──
string key = MachineCodeGenerator.GenerateLicenseKey(
machineCode, new DateTime(2026, 12, 31), password: "admin@123");
var (ok, expiry) = MachineCodeGenerator.ValidateLicenseKey(key, machineCode, "admin@123");
// ── 详细诊断 ──
LicenseResult result = MachineCodeGenerator.ValidateLicenseKey(key, machineCode);
// result.IsValid / result.ExpiryDate / result.ErrorReason
// result.MachineCodeOk / result.DateOk / result.PasswordOk / result.HasPassword
Plc — PLC 通信
MelsecPlcHelper
支持三菱 FX 系列(X/Y/M/S/T/C/D 元件),ASCII 协议串口通信。
// 连接 PLC
MelsecPlcHelper.Connect("COM1", baudRate: 9600);
// 读取
bool x0 = MelsecPlcHelper.ReadX(0);
bool y1 = MelsecPlcHelper.ReadY(1);
bool m10 = MelsecPlcHelper.ReadM(10);
short d100 = MelsecPlcHelper.ReadD(100);
short t5 = MelsecPlcHelper.ReadT(5);
// 写入
MelsecPlcHelper.WriteY(1, true);
MelsecPlcHelper.WriteM(10, false);
MelsecPlcHelper.WriteD(100, 12345);
// 轮询 D 寄存器
MelsecPlcHelper.OnDataUpdated += snapshot => {
Console.WriteLine($"D100 = {snapshot.D[100]}");
};
MelsecPlcHelper.StartPolling(new[] { 100, 101, 102 }, intervalMs: 100);
// 日志监听
MelsecPlcHelper.OnLog += (msg, level) => Console.WriteLine($"[{level}] {msg}");
// 断开
MelsecPlcHelper.Shutdown();
Application — 应用层服务
MES 通信 — MesClient
// GET 请求
string result = await MesClient.SendGetRequestAsync(
"https://mes-server/api", "production/orders", apiKey: "your-token");
// POST 请求
var data = new { OrderId = "P001", Quantity = 100 };
string response = await MesClient.SendPostRequestAsync(
"https://mes-server/api", "production/report", data, apiKey: "your-token");
桌面快捷方式 — ShortcutCreator
ShortcutCreator.CreateShortcut("我的应用", @"D:\App\MyApp.exe", arguments: "-start");
开机启动 — AutoStartManager
AutoStartManager.EnsureAutoStart("MyApp", @"D:\App\MyApp.exe", enable: true);
AutoStartManager.EnsureAutoStart("MyApp", null, enable: false); // 取消
安装验证 — VerifyInstallation
// 检查软件是否安装
bool installed = VerifyInstallation.IsSoftwareInstalled("MyApp", version: "2.0");
// 安装程序(需用户确认委托)
VerifyInstallation.Notify = (title, msg) => MessageBox.Show(msg, title) == DialogResult.OK;
await VerifyInstallation.InstallAsync("安装 MyApp", @"D:\Installer", "setup.exe");
Ezd — JCZ激光打标板卡控制
命名空间: QianTools.Ezd
通过 P/Invoke 封装 MarkEzd.dll,提供JCZ激光打标板卡的完整控制能力。支持初始化/关闭、文件加载与保存、实体管理、标刻控制、红光预览、图形编辑、笔号/填充参数设置、扩展轴控制、飞行标刻等功能。
using QianTools.Ezd;
var ezd = EzdClient.Instance;
// ── 初始化与关闭 ──
int ret = ezd.Initialize2(@"C:\Laser\EzCad2", testMode: false);
// 内部自动切换 Environment.CurrentDirectory,确保 DLL 能找到 EZCAD.CFG 和 plug/markcfg*
// ── 文件操作 ──
ezd.LoadEzdFile(@"C:\Files\product.ezd");
ezd.SaveEzdFile(@"C:\Files\output.ezd");
// ── 实体管理 ──
int count = ezd.GetEntityCount();
string name = ezd.GetEntityName(0); // 按索引获取名称
ezd.AddText("Hello", "Text1", 0, 0, 0, 1, 5, 5, "Arial", 0, false, false, false);
ezd.DeleteEntity("Text1");
ezd.MoveEntity("Text1", 10, 5); // 移动对象
ezd.RotateEntity("Text1", 0, 0, Math.PI/4); // 旋转对象
// ── 标刻控制(异步)──
int result = await ezd.MarkAsync(flyMark: false); // 全部标刻
int result = await ezd.MarkEntityAsync("Text1"); // 按实体名标刻
int result = await ezd.MarkLineAsync(0, 0, 50, 50, 1); // 线段标刻
int result = await ezd.MarkPointAsync(100, 100, 1, 1); // 点标刻
ezd.StopMark(); // 停止标刻
// ── 红光预览 ──
int ret = await ezd.RedLightMarkAsync(); // 红光范围框
int ret = await ezd.RedLightContourAsync(); // 红光轮廓
int ret = await ezd.RedLightEntityAsync("Text1", contour: true); // 指定实体红光
// 持续循环红光(需在后台线程执行)
Task.Run(() => ezd.RedLightContourLoop(() => shouldStop));
// ── 预览图获取 ──
IntPtr hBmp = ezd.GetPreviewBitmap(320, 240); // 全局预览
IntPtr hBmp = ezd.GetEntityPreviewBitmap("Text1", 320, 240); // 指定实体预览
// 使用后需释放: EzdNative.DeleteObject(hBmp);
// ── 图形编辑 ──
ezd.GroupEntities("A", "B", "AB", 1); // 合并对象
ezd.UnGroupEntity("AB"); // 分解对象
ezd.CopyEntity("A", "A_copy"); // 复制对象
ezd.HatchEntity("Name", "Source"); // 填充
ezd.ChangeTextByName("Text1", "NewText");// 修改文本内容
// ── 笔号与填充参数 ──
ezd.SetPenParam4(1, "MyPen", 0xFF0000, 100, 20, 30, false, 0, 0, 0, 0, 0, 20000, 50000, 0);
ezd.SetDefaultHatchParam(1, 0.05, 0, 0, false, 45, 0, 0);
ezd.HatchEntity("Target", "Source");
// ── IO 控制 ──
ezd.WritePort(0x00FF); // 写输出口
ezd.ReadPort(out ushort data); // 读输入口
ezd.LaserOn(true); // 激光输出/关闭
ezd.EnableLock(); // 启用锁定输入
ezd.ClearLock(); // 清除锁定
// ── 振镜与扩展轴 ──
ezd.GotoPos(100, 100); // 振镜移动到指定坐标
ezd.GetCurCoor(out double x, out double y);
ezd.SetAxisMoveParam(0, 0.5, 1, 50); // 设置扩展轴参数
ezd.AxisMoveTo(0, 120); // 扩展轴移动到指定位置
// ── 飞行标刻 ──
double speed = 0;
ezd.GetFlySpeed(ref speed);
int ret = await ezd.MarkEntityFlyAsync("Text1");
// ── 错误处理 ──
if (!EzdErrorCode.IsSuccess(ret))
Console.WriteLine(EzdErrorCode.GetMessage(ret)); // 中文错误信息
发布
dotnet pack -c Release
dotnet nuget push bin\Release\QianTools.*.nupkg --source https://api.nuget.org/v3/index.json
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0-windows7.0 is compatible. net7.0-windows was computed. net8.0-windows was computed. net8.0-windows7.0 is compatible. net9.0-windows 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.
-
net6.0-windows7.0
- ClosedXML (>= 0.104.2)
- Newtonsoft.Json (>= 13.0.4)
- SerialPortStream (>= 2.4.2)
- System.Diagnostics.PerformanceCounter (>= 8.0.0)
- System.IO.Ports (>= 8.0.0)
- System.Management (>= 8.0.0)
-
net8.0-windows7.0
- ClosedXML (>= 0.104.2)
- Newtonsoft.Json (>= 13.0.4)
- SerialPortStream (>= 2.4.2)
- System.Diagnostics.PerformanceCounter (>= 8.0.0)
- System.IO.Ports (>= 8.0.0)
- System.Management (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
2.3.5:文档描述规范化(JCZ 替代原品牌名),NuGet 包说明全面重构,覆盖全部模块 API。