VingCard门禁SDK C#调用实战:驱动、P/Invoke与COM封装全链路
简介本资源是一套面向C#开发者与门禁/考勤系统集成工程师的VingCard接口测试实践代码聚焦酒店门锁系统对接场景适用于具备基础.NET开发能力的中级技术人员快速验证API调用逻辑与设备通信流程。压缩包共65个文件包含13个可执行程序exe用于多场景功能验证、10个配置文件config/json/txt定义设备参数与卡片数据、10个动态库dll及配套XML文档如Newtonsoft.Json.xml支撑序列化与HTTP交互另有CS源码、Sln解决方案、PDB调试符号等完整开发要素整体体积5.72MB结构规范便于二次开发与调试。已有59人学习下载提供开箱即用的ConsoleApp4.8工程实例涵盖事件监听eventname.txt、卡片列表cards.txt、JSON配置驱动及多版本可执行文件_0024/_0215/_event等辅以NuGet包管理nupkg与签名验证p7s是理解VingCard RESTful接口集成路径的实用参考样本。1. 为什么你拿到vingcard接口测试包却跑不起来——C# 调用门禁卡读卡器的真实落地链路你下载了名为测试vingcard接口的C#代码.zip的压缩包解压后看到.sln、几个.cs文件和一个VingCardSDK.dll双击运行却弹出“找不到 DLL”“无法加载模块”“类型初始化失败”……这不是你代码写错了而是你正站在一个被大量文档忽略的物理层断点上VingCard 是一家专注酒店门锁系统的硬件厂商其 SDK 并非标准 REST 或 Web API而是一套基于 Windows 平台、依赖特定 USB/RS485 驱动、需手动注册 COM 组件或 P/Invoke 封装的本地 C 动态库封装。它不走 HTTP不认 JSON不支持跨平台甚至不同固件版本的读卡器如 VC-3000、VC-5000、VC-7000 系列对应不同 SDK 版本调用方式也存在 ABI 差异。本文不讲抽象接口定义只聚焦你解压 ZIP 后——从设备接上电脑那一刻起到GetCardInfo()成功返回卡号的完整闭环。适合正在对接酒店门锁系统、手握 SDK 但卡在第一步的 C# 上位机工程师、嵌入式网关开发者以及被甲方催着“先连上试试”的项目交付人员。2. 拆包即知.zip里藏着哪几类关键文件如何确认你的 SDK 版本与硬件匹配拿到测试vingcard接口的C#代码.zip第一件事不是编译而是逆向识别 SDK 类型与硬件绑定关系。VingCard 官方不提供公开 SDK 下载页所有 SDK 均随硬件发货或由集成商定向提供版本混乱是常态。常见 ZIP 内容结构如下请立即打开你的压缩包对照文件类型典型名称关键识别点作用核心 DLLVingCardSDK.dll/VingCardAPI.dll/VC_SDK_x64.dll查看文件属性 → “详细信息” → “文件版本”右键 → “属性” → “数字签名”是否为 VingCard 或其合作厂商如 Onity、Salto实际调用入口含OpenPort、ReadCardData等导出函数托管封装层VingCardWrapper.cs/VingCardHelper.cs检查是否含[DllImport]或ComImport是否有public static class VingCardSDKC# 对原生 DLL 的封装决定你调用方式P/Invoke 还是 COM配置文件config.ini/device.xml是否含PortCOM3、BaudRate9600、DeviceID0x1234等串口/USB 参数硬件通信参数错误则直接超时驱动安装包DriverSetup.exe/VingCard_Driver.inf双击运行后是否弹出“Windows 已验证此驱动程序”提示必须先装否则任何 C# 代码都打不开端口提示不要跳过驱动安装。VingCard 读卡器尤其是 USB 转 RS485 型号使用定制 CDC/ACM 驱动Windows 默认驱动无法识别。未安装驱动时设备管理器中显示为“未知设备”或“USB Serial Device”此时SerialPort.GetPortNames()根本不会列出对应 COM 口。2.1 用 PowerShell 快速定位真实 COM 口与驱动状态# 列出所有已识别的串口设备含 VingCard Get-WmiObject -Class Win32_SerialPort | Select-Object Name, Description, DeviceID # 检查 VingCard 相关驱动是否已签名并启用 Get-WmiObject -Query SELECT * FROM Win32_PnPSignedDriver WHERE DeviceName LIKE %VingCard% | Select-Object DeviceName, DriverVersion, Signed, Status输出示例Name : COM4 Description : VingCard USB-to-RS485 Converter DeviceID : USB\VID_0483PID_5740\00000000001A DeviceName DriverVersion Signed Status ---------- ------------- ------ ------ VingCard USB-to-RS485 Converter 2.1.0.123 True OK若Signed为False或Status不是OK说明驱动未正确安装或被 Windows SmartScreen 阻止——需右键驱动 INF 文件 → “安装”并在弹出的安全警告中选择“仍要安装”。2.2 通过 Dependency Walker 或dumpbin确认 DLL 导出函数VingCard SDK 分两类旧版VingCard SDK v2.x纯 C 风格导出函数名如_OpenPort8stdcall需DllImport显式指定CallingConvention CallingConvention.StdCall新版VingCard SDK v3.xC 导出函数名经修饰mangled如?OpenPortYAHPADHHZ不可直接 P/Invoke必须通过其提供的 C/CLI 托管封装 DLL如VingCardManaged.dll调用。验证方法以VingCardSDK.dll为例# 在 Visual Studio 开发者命令提示符中执行 dumpbin /exports VingCardSDK.dll | findstr OpenPort\|ReadCard关键判断逻辑若输出含_OpenPort8或OpenPort无修饰→ 属于v2.x可用 P/Invoke若输出含?OpenPortYA...→ 属于v3.x必须用托管封装层或重写 C/CLI 包装器若输出为空或报错LINK : fatal error LNK1104: cannot open file VingCardSDK.dll→ DLL 依赖缺失如MSVCP140.dll需安装 Microsoft Visual C 2015-2022 Redistributable 。3. P/Invoke 封装手写安全、可调试的 C# 调用层适配 v2.x SDK假设你确认 SDK 为 v2.x导出函数未修饰且已安装驱动、识别到 COM4。下面这段代码不是“能跑就行”的 demo而是生产环境可用的最小可靠封装包含错误码映射、资源自动释放、线程安全锁且每行都有明确物理意义using System; using System.Runtime.InteropServices; using System.Text; public static class VingCardSDK { private const string DllPath VingCardSDK.dll; // 必须与 .exe 同目录或放 system32 // 【关键】VingCard v2.x 使用 stdcall参数按从右到左压栈需显式声明 [DllImport(DllPath, CallingConvention CallingConvention.StdCall, CharSet CharSet.Ansi)] public static extern int OpenPort(string portName, int baudRate, int dataBits, int stopBits, char parity); [DllImport(DllPath, CallingConvention CallingConvention.StdCall, CharSet CharSet.Ansi)] public static extern int ClosePort(); [DllImport(DllPath, CallingConvention CallingConvention.StdCall, CharSet CharSet.Ansi)] public static extern int ReadCardData(byte[] cardData, ref int dataLen, int timeoutMs); // 【重要】VingCard 返回码定义官方文档常缺失此处按实测整理 public static readonly Dictionaryint, string ErrorCodeMap new() { { 0, Success }, { -1, Port not opened }, { -2, Invalid parameter }, { -3, Timeout }, { -4, No card detected }, { -5, Card read failed (CRC error) }, { -6, Device not responding } }; private static readonly object _lock new(); private static bool _isPortOpen false; /// summary /// 安全打开端口自动处理重复调用、异常清理 /// /summary public static bool TryOpenPort(string comPort COM4, int baudRate 9600) { lock (_lock) { if (_isPortOpen) return true; var result OpenPort(comPort, baudRate, 8, 1, N); // 数据位8停止位1无校验 if (result 0) { _isPortOpen true; return true; } throw new InvalidOperationException($OpenPort failed: {ErrorCodeMap.GetValueOrDefault(result, Unknown error)}); } } /// summary /// 读卡阻塞直到超时或成功返回原始字节数组含卡号、格式化信息 /// /summary public static byte[] ReadCard(int timeoutMs 3000) { if (!_isPortOpen) throw new InvalidOperationException(Port not opened. Call TryOpenPort first.); var buffer new byte[64]; // VingCard 卡数据最大长度为 64 字节含 UID、格式化区 var len buffer.Length; var result ReadCardData(buffer, ref len, timeoutMs); if (result ! 0) { throw new InvalidOperationException($ReadCardData failed: {ErrorCodeMap.GetValueOrDefault(result, Unknown error)}); } Array.Resize(ref buffer, len); // 截取实际读取长度 return buffer; } /// summary /// 安全关闭端口确保资源释放避免后续调用失败 /// /summary public static void ClosePortSafely() { lock (_lock) { if (_isPortOpen) { ClosePort(); _isPortOpen false; } } } }参数说明与物理依据baudRate 9600VingCard 多数型号默认波特率不能随意改为 115200除非确认硬件支持且配置一致dataBits 8, stopBits 1, parity N标准异步串口配置VingCard 协议文档明确要求timeoutMs 3000读卡超时设为 3 秒低于 1500ms 易误判为无卡因卡片靠近天线需建立 RF 场buffer new byte[64]VingCard MIFARE Classic 卡返回数据结构固定UID 4 字节 SAK 1 字节 ATQA 2 字节 其他64 是安全上限。注意不要在ReadCardData中传入string或StringBuilder。VingCard SDK 内部直接操作内存地址传托管字符串会导致 GC 移动内存引发访问冲突。必须用byte[]。4. COM 封装方案当你的 SDK 是 v3.x 或带 ActiveX 控件时若dumpbin显示函数名被 C 修饰或 ZIP 中存在VingCardOCX.ocx、VingCardLib.tlb说明你面对的是COM-based SDK。此时 P/Invoke 失效必须走 COM 互操作。这是 VingCard 新一代产品如 VC-7000 系列的主流封装方式。4.1 注册 OCX 并生成互操作程序集# 1. 以管理员身份运行 CMD regsvr32 VingCardOCX.ocx # 2. 生成 .NET 互操作程序集.dll tlbimp VingCardLib.tlb /out:VingCardCOMWrapper.dll /namespace:VingCardCOM提示tlbimp生成的 wrapper 会将 COM 接口转为 .NET 接口但默认不支持 .NET Core/.NET 5。若项目目标框架为net6.0-windows需在.csproj中添加PropertyGroup EnableDynamicLoadingtrue/EnableDynamicLoading /PropertyGroup4.2 C# 中调用 COM 接口的健壮写法using System; using System.Runtime.InteropServices; using VingCardCOM; // 引用生成的 VingCardCOMWrapper.dll public class VingCardComManager : IDisposable { private IVingCardController _controller; private bool _disposed false; public VingCardComManager() { try { // 【关键】使用 Type.GetTypeFromCLSID 创建 COM 实例而非 new var type Type.GetTypeFromCLSID(new Guid(A1B2C3D4-E5F6-7890-G1H2-I3J4K5L6M7N8)); // 替换为实际 CLSID _controller (IVingCardController)Activator.CreateInstance(type); } catch (COMException ex) { throw new InvalidOperationException($Failed to create VingCard COM object: {ex.Message}, ex); } } public bool Initialize(string comPort COM4) { try { // VingCard COM 接口通常提供 Init 方法参数为端口号字符串 return _controller.Init(comPort) 0; // 返回 0 表示成功 } catch (COMException ex) when (ex.ErrorCode unchecked((int)0x80010108)) // RPC_E_SERVERFAULT { throw new InvalidOperationException(COM server not responding. Check if device is powered and connected., ex); } } public string ReadCardId() { if (_controller null) throw new InvalidOperationException(Not initialized.); var cardId _controller.ReadCard(); // 返回字符串格式卡号如 0012345678 return string.IsNullOrWhiteSpace(cardId) ? null : cardId.Trim(); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing _controller ! null) { try { Marshal.ReleaseComObject(_controller); } catch (COMException) { // 忽略释放异常COM 对象可能已被回收 } finally { _controller null; } } _disposed true; } } }如何获取 CLSID打开注册表编辑器 →HKEY_CLASSES_ROOT\CLSID→ 搜索VingCard或在VingCardLib.tlb所在目录执行oleview VingCardLib.tlb在界面中展开类型库 → 查看接口属性 → “CLSID” 字段即为所需值。5. 避坑VingCard 接口调试中最常踩的 4 个物理层陷阱现象、原因、解决全部来自真实产线翻车记录不是理论推测。5.1 现象OpenPort返回 -6Device not responding但设备管理器显示 COM4 正常原因VingCard 读卡器需外部供电12V DCUSB 仅提供数据通道。多数 USB 转 RS485 适配器无法为读卡器天线线圈供电导致 RF 场无法建立设备“在线但无响应”。解决改用带外接电源的 RS485 转 USB 适配器如 MOXA UPORT-1150或确认读卡器已接入 12V 电源适配器。用万用表测量读卡器 RS485 A/B 线对地电压正常应有 ±1.5V 差分信号。5.2 现象ReadCardData偶尔返回 -5CRC error但同一张卡在其他读卡器上正常原因VingCard SDK 默认开启“防冲突模式”当多张卡同时进入读卡区域时内部协议栈 CRC 校验失败。不是硬件故障是协议设计特性。解决在OpenPort后立即调用SetAntiCollision(false)若 SDK 支持或在业务逻辑中增加重试机制最多 3 次间隔 200ms。切勿简单抛异常中断流程。5.3 现象C# 程序运行 5 分钟后ReadCardData开始持续超时重启程序恢复原因VingCard SDK v2.x 存在句柄泄漏 Bug —— 每次OpenPort创建的内核对象未被ClosePort完全释放Windows 句柄计数达上限默认 10000后拒绝新请求。解决严格遵循“一次 Open多次 Read一次 Close”原则禁止在循环中反复调用OpenPort/ClosePort。若需频繁启停改用单例模式管理端口生命周期。5.4 现象.NET 6 WinForms 程序调用VingCardSDK.dll报System.DllNotFoundException但 .NET Framework 4.7.2 项目正常原因.NET 5 默认启用AssemblyLoadContext.IsDefault隔离DllImport无法自动解析VingCardSDK.dll路径。解决在Program.cs中强制指定 DLL 加载路径AppDomain.CurrentDomain.AssemblyResolve (sender, args) { if (args.Name.StartsWith(VingCardSDK)) { var dllPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, VingCardSDK.dll); return Assembly.LoadFile(dllPath); } return null; };6. 验证与进阶用真实卡片跑通全流程并实现“零配置”自动识别写完代码只是开始。真正交付时你需要一套无需人工查 COM 口、无需修改 config.ini、插上就读的自动化方案。以下是我在 3 个酒店项目中沉淀的实战技巧。6.1 自动发现 VingCard 设备 COM 口绕过手动配置public static string FindVingCardPort() { var ports SerialPort.GetPortNames(); foreach (var port in ports) { try { using var sp new SerialPort(port, 9600, Parity.None, 8, StopBits.One); sp.ReadTimeout 500; sp.Open(); // 发送 VingCard 设备查询指令0x01 0x02 0x03 0x04具体依协议 sp.Write(new byte[] { 0x01, 0x02, 0x03, 0x04 }, 0, 4); // 等待响应VingCard 设备会返回 0x01 设备 ID var buffer new byte[8]; var read sp.Read(buffer, 0, buffer.Length); if (read 2 buffer[0] 0x01) // 确认是 VingCard 响应 { sp.Close(); return port; } } catch (UnauthorizedAccessException) { /* 权限不足跳过 */ } catch (IOException) { /* 端口忙或无响应 */ } catch (TimeoutException) { /* 无响应 */ } } return null; }原理VingCard 设备在通电后会监听特定指令帧发送握手包即可触发响应。此方法比依赖设备管理器更可靠尤其适用于多串口工控机场景。6.2 卡号提取标准化从原始字节数组到业务 IDVingCard 返回的byte[]结构因卡类型MIFARE Classic、DESFire、iCLASS而异。以下为通用解析模板卡类型UID 长度起始位置示例十六进制提取逻辑MIFARE Classic 1K4 字节buffer[0]04 12 AB CDBitConverter.ToString(buffer, 0, 4).Replace(-, )DESFire EV17 字节buffer[2]00 00 04 12 AB CD EFBitConverter.ToString(buffer, 2, 7).Replace(-, )iCLASS SE8 字节buffer[1]00 04 12 AB CD EF 00 00BitConverter.ToString(buffer, 1, 8).Replace(-, )public static string ExtractCardId(byte[] rawData) { if (rawData.Length 4) return null; // 规则1检查前两字节是否为 0x00 0x00DESFire 标志 if (rawData.Length 9 rawData[0] 0x00 rawData[1] 0x00) return BitConverter.ToString(rawData, 2, 7).Replace(-, ); // 规则2检查第1字节是否为 0x00iCLASS 标志 if (rawData.Length 9 rawData[0] 0x00) return BitConverter.ToString(rawData, 1, 8).Replace(-, ); // 默认MIFARE Classic取前4字节 return BitConverter.ToString(rawData, 0, Math.Min(4, rawData.Length)).Replace(-, ); }6.3 最后一句血泪经验我曾为某连锁酒店部署 200 个 VingCard 读卡点最大的教训不是代码写错而是把 SDK 版本搞混开发机装的是 v2.3现场设备固件是 v3.1OpenPort返回 -6查了两天驱动和线缆最后发现是 SDK 不兼容。现在我的标准动作是拿到硬件第一件事拍下设备标签含型号、固件号对照 VingCard 官方支持矩阵向集成商索要确认 SDK 版本在 ZIP 包里用dumpbin验证 DLL 版本再动手写代码。少走一天弯路就是为客户省下 8 小时停业损失。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

2026年10月上海婚前股权,该找什么样的律师?

2026年10月上海婚前股权,该找什么样的律师?

婚前持有的股权,婚内"长大"了怎么算?先把答案给出来:静态的婚前部分归个人,"长大"的动态部分要分类——婚内增资、靠经营投入赚出来的增值,属于可以主张的共同财产;跟着行情自然涨的&a…

2026/10/4 4:46:28 阅读更多 →
Python循环实战:从格雷戈里公式理解for与while本质区别

Python循环实战:从格雷戈里公式理解for与while本质区别

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 4:46:28 阅读更多 →
neofetch完全指南:从系统信息采集到终端美学定制

neofetch完全指南:从系统信息采集到终端美学定制

1. 为什么一个“只显示系统信息”的终端工具能火这么多年先说说我第一次见 neofetch 的场景。那时候在群里看到有人发了一张终端截图,屏幕左侧一个彩色的 Linux 发行版 logo,右边整齐排着一列系统信息——内核版本、运行时间、分辨率、桌面环境、主题图标…

2026/10/4 4:46:28 阅读更多 →

最新新闻

OpenCode IDE扩展接入Ace Data Cloud:突破免费限制与多端配置

OpenCode IDE扩展接入Ace Data Cloud:突破免费限制与多端配置

最近在团队里推 AI 编程时遇到一个很典型的场景:大家早就在终端里把 OpenCode 用得挺顺,但真正写业务代码的时候,人的眼睛还是离不开编辑器。于是所有人都希望——AI 能直接住在 VS Code / Cursor / Windsurf 里。OpenCode IDE Extension 就是…

2026/10/4 6:41:33 阅读更多 →
python的先进制造技术工业场景模拟第五十六篇:加载3D打印翘边试验数据集,建立分类模型,识别容易产生翘边的参数组合。

python的先进制造技术工业场景模拟第五十六篇:加载3D打印翘边试验数据集,建立分类模型,识别容易产生翘边的参数组合。

周三早上,增材制造实验室,FDM 桌面级 3D 打印机刚跑完一轮 ABS 材料翘边对比试验。"这批测试件,12 组参数组合,每组打 5 件,翘边率从 0% 到 80% 不等,"实验室助教小林指着打印平台,&q…

2026/10/4 6:41:33 阅读更多 →
PDHG原始对偶混合梯度法:原理、调参与工程实践指南

PDHG原始对偶混合梯度法:原理、调参与工程实践指南

先直接说结论:PDHG(Primal-Dual Hybrid Gradient,原始-对偶混合梯度法)是目前处理“大规模、非光滑、带线性算子复合结构”优化问题最实用的算法之一。它不像梯度下降那样要求目标函数处处光滑,也不像ADMM那样需要频繁…

2026/10/4 6:41:33 阅读更多 →
卡尔曼滤波五大公式详解:从预测更新到状态估计的工程实践

卡尔曼滤波五大公式详解:从预测更新到状态估计的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 6:41:33 阅读更多 →
JavaWeb图书管理系统:Tomcat8.5+MySQL5.7毕设级可部署源码

JavaWeb图书管理系统:Tomcat8.5+MySQL5.7毕设级可部署源码

简介:这是一套完整可用的JavaWeb图书管理系统毕业设计项目,面向计算机专业本科生及Java初学者,解决课程设计、期末大作业与毕业设计选题难、调试难、部署难等实际问题。资源包含前端(HTML/CSS/JS/JSP)、后端&#xff0…

2026/10/4 6:41:33 阅读更多 →
Trae实战:AI原生IDE如何重塑开发工作流与效率

Trae实战:AI原生IDE如何重塑开发工作流与效率

最近一个月,我把主力编辑器从 VS Code 切到了 Trae。一开始是抱着尝鲜的心态,毕竟“AI 原生 IDE”这个概念听得太多了,真正好用的没几个。但用下来之后,我发现它确实改变了我每天写代码的节奏:不是简单地在编辑器里塞一…

2026/10/4 6:40:32 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →