ArcGIS Engine C#桌面集成实战:License、图层、空间查询与地理PDF导出
简介本资源是面向GIS开发初学者与C#程序员的ArcGIS Engine实战代码包聚焦基于.NET平台的桌面GIS应用构建解决空间数据可视化、地图交互、地理编码与空间分析等核心开发需求。压缩包含482个文件总计4.18MB其中99个C#源码文件.cs构成完整工程逻辑34个DLL和31个PDB支持ArcObjects调用与调试43个BMP与7个PNG提供界面资源21个GDB相关文件gdbtable、gdbindexes等封装示例地理数据库结构另有15个CSProj与5个SLN确保Visual Studio项目可直接加载编译。已有648人学习下载内容严格对应《ArcGIS Engine开发技术——基于C#的GIS应用实践》一书知识点覆盖MapControl集成、图层管理、缓冲区分析、GeocodingControl地址解析及TOCControl控件定制等典型场景代码结构清晰、注释完备适合作为教学参考、项目原型或二次开发基础框架。1. ArcGIS Engine 开发技术不是“装个控件就能拖控件”的幻觉而是用 C# 深度嵌入 GIS 能力到自有桌面系统的硬核路径你手头有个 WinForms/WPF 桌面程序客户要求在界面上直接叠加矢量图层、执行空间查询、导出带地理坐标的 PDF 报告——但又不希望用户跳转到 ArcMap 或 ArcGIS Pro。这时候ArcGIS Engine 不是“过时的旧技术”而是目前 Windows 桌面端唯一能绕过许可限制、合法将 ESRI 核心空间引擎Geometry、Topology、Geoprocessing、Renderer以本地 DLL 方式集成进 C# 应用的官方方案。它不依赖 ArcGIS Online 订阅不走 Web API所有空间运算都在本机内存完成但代价是必须手动管理 License 初始化、COM 对象生命周期、线程 Apartment 模型且 ArcGIS Engine 10.8.1 是最后一个支持 .NET Framework 4.8 的版本——这意味着你得在 Visual Studio 2019 .NET Framework 4.8 环境下开工而不是 .NET 6/8。本文不讲“如何安装 Runtime”只聚焦真实项目里怎么让IActiveView真正刷新、为什么IFeatureClass.CreateFeature()总抛 COMException、怎样用 C# 安全释放IGeometry避免内存泄漏、以及最关键的——如何绕过 ESRI 文档里没明说的“License Check 黑匣子”陷阱。适合已掌握 C# 基础、有 WinForms 开发经验、正被 GIS 功能卡在交付节点的工程师。2. 环境搭建与 License 初始化从注册表读取许可不是玄学而是必须亲手写的三行关键代码ArcGIS Engine 不像 NuGet 包那样Install-Package就完事。它的 Runtime 必须先在目标机器上安装独立的 ArcGIS Engine Runtime非 ArcGIS Desktop且 License 初始化失败会导致后续所有 COM 接口调用静默返回 null 或抛出HRESULT: 0x80040201。这不是配置问题是 ESRI 强制的许可链校验机制。2.1 安装 Runtime 与开发包的不可替代性Runtime 安装包必须从 ESRI 官方下载ArcGIS_Engine_1081_Desktop.msi注意Engine Runtime 和 Desktop Runtime 不通用。安装后注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ESRI\License\ArcGIS下会生成ARCGIS_ENGINE子项内含LicenseKey和LicenseType。开发包SDK需单独安装ArcGIS_Engine_SDK_1081_Desktop.msi它提供ESRI.ArcGIS.System.dll、ESRI.ArcGIS.Geometry.dll等 Interop 程序集并在 VS 中注册类型库引用。提示不要试图用tlbimp.exe手动导入esriSystem.olb—— ESRI 的 Interop 程序集经过特殊签名和版本绑定手动导入会导致InvalidCastException。2.2 C# 中初始化 License 的最小可靠代码块// 必须在 Application.Run() 之前执行且仅一次 ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine); // 关键显式指定 License Level不能依赖默认值 var license new ESRI.ArcGIS.esriSystem.AoInitializeClass(); esriLicenseStatus status license.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine); if (status ! esriLicenseStatus.esriLicenseAvailable) { MessageBox.Show($License 初始化失败状态码{(int)status}); Environment.Exit(1); // 不能继续否则后续 COM 调用必崩 } // 验证获取当前 License 信息调试用 string productInfo license.GetLicenseProductInfo(esriLicenseProductCode.esriLicenseProductCodeEngine); Console.WriteLine($Engine License Info: {productInfo}); // 输出类似 Engine - Advanced逻辑说明RuntimeManager.Bind()告诉 ArcGIS 运行时使用 Engine 产品线AoInitializeClass.Initialize()才真正触发许可校验。esriLicenseProductCodeEngine对应 Engine Advanced 级别支持所有 Geoprocessor 工具若客户只买了 Basic 许可则需改用esriLicenseProductCodeEngineBasic但此时ITopologicalOperator等高级接口将不可用。2.3 为什么ESRI.ArcGIS.System.AoInitialize必须是全局单例ESRI 的 COM 组件采用进程级 License 管理。若在多个线程中重复调用Initialize()第二次调用会返回esriLicenseNotLicensed即使第一次成功。常见翻车场景在 WinForm 构造函数中初始化 License又在某个按钮事件里再次调用Initialize()导致后续地图控件加载失败错误日志却只显示NullReferenceException。血泪经验把 License 初始化封装成静态类LicenseHelper用LazyT保证线程安全且只在Program.cs的Main()函数最开头调用一次。3. 地图控件集成与图层加载AxMapControl不是“拖控件就完事”而是必须手动接管OnDraw生命周期AxMapControl是 ArcGIS Engine 提供的 ActiveX 封装控件但它在 .NET 中的行为与普通 WinForms 控件有本质差异它不遵循Paint事件所有渲染由底层 COM 控件自主控制你无法通过Invalidate()强制重绘必须调用Refresh()或PartialRefresh()。3.1 在 WinForms 中正确宿主AxMapControl的三步法设计器中拖入控件后必须手动设置Dock DockStyle.FillAxMapControl不响应AutoSize若未填满父容器地图会显示为左上角一小块黑区。禁用双缓冲关键AxMapControl内部已实现 DirectX 渲染启用DoubleBuffered true会导致图层闪烁或完全不显示。必须订阅OnExtentUpdated事件而非SizeChanged地图缩放/平移后Extent改变才是重绘触发点SizeChanged仅在窗体大小变化时触发与地图无关。3.2 加载 Shapefile 的最小可行代码含异常捕获private void LoadShapefile(string shpPath) { try { // 1. 创建工作空间工厂必须用 ShapefileWorkspaceFactory不能用 FileGDBWorkspaceFactory IWorkspaceFactory workspaceFactory new ShapefileWorkspaceFactoryClass(); IWorkspace workspace workspaceFactory.OpenFromFile(Path.GetDirectoryName(shpPath), 0); // 2. 获取要素类注意shpPath 是 .shp 文件全路径但 OpenFeatureClass 参数只需文件名不含扩展名 IFeatureWorkspace featureWorkspace (IFeatureWorkspace)workspace; string fileNameWithoutExt Path.GetFileNameWithoutExtension(shpPath); IFeatureClass featureClass featureWorkspace.OpenFeatureClass(fileNameWithoutExt); // 3. 创建图层并添加到地图 IFeatureLayer featureLayer new FeatureLayerClass(); featureLayer.FeatureClass featureClass; featureLayer.Name featureClass.AliasName; // 自动取 .shp 的别名比 FileName 更可靠 // 4. 强制刷新地图关键否则图层不显示 axMapControl1.AddLayer(featureLayer, 0); axMapControl1.ActiveView.Refresh(); // 必须调用否则白屏 } catch (COMException ex) when (ex.ErrorCode unchecked((int)0x80040201)) { MessageBox.Show(Shapefile 路径无效或坐标系不匹配请检查 .prj 文件是否存在); } catch (Exception ex) { MessageBox.Show($加载失败{ex.Message}); } }参数说明workspaceFactory.OpenFromFile()的第二个参数是hWnd传0即可表示无父窗口OpenFeatureClass()的参数是fileNameWithoutExt不是完整路径否则抛ERROR_INVALID_PARAMETERaxMapControl1.AddLayer()的第二个参数0表示插入到图层列表顶部-1表示底部。3.3 为什么IFeatureClass的SpatialReference必须显式设置Shapefile 自带.prj文件但OpenFeatureClass()不自动读取它。若.prj缺失或损坏featureClass.SpatialReference为null导致图层加载后显示为“未知坐标系”地图比例尺失效空间查询如IQueryFilter.WhereClause返回空结果IGeometry.Project()抛HRESULT: 0x80040217。解决方案加载后立即校验并修复if (featureClass.SpatialReference null || featureClass.SpatialReference.IsUnknown true) { // 强制设为 WGS84根据项目需求调整 ISpatialReferenceFactory srFactory new SpatialReferenceEnvironmentClass(); featureClass.SpatialReference srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984); }4. 空间查询与要素编辑IQueryFilter的WhereClause不是 SQL而是 ArcObjects 特定语法ArcGIS Engine 的查询引擎不直接执行 SQL而是将WhereClause解析为底层几何索引查询条件。写错语法不会报错但返回空结果——这是最隐蔽的坑。4.1IQueryFilter.WhereClause的正确写法与常见陷阱// ✅ 正确字段名用双引号包裹字符串值用单引号数值不用引号 IQueryFilter queryFilter new QueryFilterClass(); queryFilter.WhereClause $\NAME\ Beijing AND \POPULATION\ 1000000; // ❌ 错误写法全部翻车 // queryFilter.WhereClause NAME Beijing; // 字段名未加引号 → 返回空 // queryFilter.WhereClause NAME Beijing; // 字符串值用双引号 → COMException // queryFilter.WhereClause POPULATION 1000000; // 数值用引号 → 类型转换失败核心规则字段名如NAME,POPULATION必须用英文双引号包裹字符串值如Beijing必须用英文单引号包裹数值如1000000直接写不加任何引号日期字段用#2023/01/01#格式Access 风格LIKE操作符支持%通配符NAME LIKE Bei%。4.2 安全创建新要素IFeatureClass.CreateFeature()的四步原子操作public IFeature CreateNewFeature(IFeatureClass featureClass, IPoint point, string name) { // Step 1: 创建空要素必须用 CreateFeature不能 new FeatureClass IFeature feature featureClass.CreateFeature(); // Step 2: 设置几何必须 Clone否则共享引用导致后续修改污染 IGeometry geometry point.Clone() as IGeometry; feature.Shape geometry; // Step 3: 设置属性字段索引比字段名快 10 倍且避免拼写错误 int nameIndex featureClass.FindField(NAME); feature.set_Value(nameIndex, name); int idIndex featureClass.FindField(ID); feature.set_Value(idIndex, GetNextId()); // 自定义 ID 生成逻辑 // Step 4: 存储必须调用 Store否则数据不写入 feature.Store(); // 这一步才真正写入数据库/Shapefile return feature; }为什么必须Clone()几何对象IPoint是 COM 对象若直接赋值feature.Shape point则feature和外部point共享同一内存地址。后续若修改point.Xfeature.Shape也会变导致数据错乱。Clone()返回新实例彻底隔离。4.3 删除要素的线程安全写法// ❌ 危险在 foreach 中删除会抛 InvalidOperationException // foreach (IFeature feat in features) { feat.Delete(); } // ✅ 正确先收集 OID再批量删除 Listint oidsToDelete new Listint(); IEnumIDs enumIds featureClass.Search(queryFilter, false).OIDSet as IEnumIDs; int oid; while ((oid enumIds.Next()) ! -1) { oidsToDelete.Add(oid); } // 批量删除比单条 Delete 快 50 倍 ITable table (ITable)featureClass; table.DeleteRows(new QueryFilterClass { WhereClause $OBJECTID IN ({string.Join(,, oidsToDelete)}) });5. 避坑指南ArcGIS Engine 开发中 5 个血泪教训每一条都让项目延期 3 天5.1 现象AxMapControl在多显示器环境下地图显示错位或拉伸原因AxMapControl的 DPI 感知模式默认为UnawareWindows 10/11 的高 DPI 缩放如 125%会导致控件内部坐标计算失准ScreenToMap/MapToScreen转换偏移。解决在app.manifest中启用 DPI 感知application xmlnsurn:schemas-microsoft-com:asm.v3 windowsSettings dpiAware xmlnshttp://schemas.microsoft.com/SMI/2005/WindowsSettingstrue/dpiAware /windowsSettings /application并在Program.cs中添加[DllImport(user32.dll)] private static extern bool SetProcessDPIAware(); // 在 Main() 开头调用 SetProcessDPIAware();5.2 现象IGeometry对象在 GC 后引发COM object that has been separated from its underlying RCW异常原因IGeometry是 COM 对象.NET GC 不知道其生命周期当IGeometry被 GC 回收后底层 COM 对象可能已被释放但其他地方仍持有引用。解决所有IGeometry实例必须显式调用Marshal.ReleaseComObject()IGeometry geometry ...; // 使用完毕后 if (geometry ! null Marshal.IsComObject(geometry)) { Marshal.ReleaseComObject(geometry); geometry null; // 防止重复释放 }注意必须在finally块中释放且释放后置null否则二次释放抛InvalidComObjectException。5.3 现象Geoprocessor.Execute()执行Buffer_analysis工具时卡死CPU 占用 100%原因Geoprocessor默认在 STA 线程运行而Buffer_analysis是 CPU 密集型操作阻塞 UI 线程导致假死。解决将 Geoprocessor 移到 MTA 线程执行Task.Run(() { var gp new GeoprocessorClass(); gp.OverwriteOutput true; IGeoProcessorResult result gp.Execute(Buffer_analysis, parameters, null); });5.4 现象IFeatureLayer.Renderer设置后地图不更新Refresh()无效原因Renderer属于图层样式必须在AddLayer()之后、Refresh()之前设置且需调用ILayer.Visible true。解决featureLayer.Visible true; // 必须设为 true featureLayer.Renderer CreateSimpleRenderer(); // 自定义渲染器 axMapControl1.AddLayer(featureLayer, 0); axMapControl1.ActiveView.Refresh(); // Refresh 必须在最后5.5 现象发布 EXE 到客户机器后启动即报Could not load file or assembly ESRI.ArcGIS.System原因ESRI.ArcGIS.*程序集是 Interop 程序集其Embed Interop Types True默认但目标机器缺少ESRI.ArcGIS.System.dll的 GAC 注册。解决在项目属性 → “引用” → 右键ESRI.ArcGIS.System→ “属性” → 将Embed Interop Types设为False并设置Copy Local True确保 DLL 随 EXE 一起部署。6. 进阶技巧用 C# 实现 ArcGIS Engine 的“无感”地图导出——PDF 带地理参考与图例自动适配客户要的不是截图而是符合 GIS 出图规范的 PDF带地理坐标、比例尺、指北针、动态图例随可见图层自动增减、且文件大小可控。IMapDocument.ExportToPDF()是官方方案但它导出的 PDF 是栅格化图像丢失地理参考。真正的解法是IExport接口配合IPaper设置。6.1 导出带地理参考的 PDFVector-based非截图private void ExportMapToGeoreferencedPdf(string outputPath) { IActiveView activeView axMapControl1.Map as IActiveView; IExport export new ExportPDFClass(); export.ExportFileName outputPath; export.Resolution 300; // DPI影响清晰度 export.ColorSpace esriColorSpace.esriColorSpaceCMYK; // 关键设置地理参考元数据 IExportPDF exportPdf export as IExportPDF; exportPdf.Georeference true; // 启用地理参考 exportPdf.WorldFile true; // 生成 .wld 文件可选 // 设置纸张大小A4210mm × 297mm → 8.27in × 11.69in IPaper paper activeView.Paper; paper.Width 8.27; paper.Height 11.69; // 获取导出范围当前视图范围 IEnvelope exportEnv activeView.Extent; export.ExportRectangle exportEnv; // 执行导出 tagRECT exportRect; exportRect.left 0; exportRect.top 0; exportRect.right (int)(paper.Width * export.Resolution); exportRect.bottom (int)(paper.Height * export.Resolution); export.ExportFrame exportRect; export.Export(); }为什么Georeference true能生成地理 PDFArcGIS Engine 的 PDF 导出器会在 PDF 文件中嵌入 GeoPDF 标准的地理元数据包括坐标系、控制点、大地基准Adobe Acrobat Reader 的“地理定位”工具可直接读取支持坐标拾取、距离量测。6.2 动态图例生成用ILegend接口实时构建图层列表private ILegend CreateDynamicLegend(IMap map) { ILegend legend new LegendClass(); legend.Map map; legend.AutoVisibility true; // 自动隐藏不可见图层 legend.AutoAdd true; // 自动添加新图层 legend.UseMapSurrounds true; // 使用地图边框比例尺、指北针等 // 强制刷新图例内容 legend.Refresh(); return legend; }落地效果当用户勾选/取消图层可见性时图例自动增减对应项无需手动维护。6.3 控制 PDF 文件大小的三个参数参数推荐值效果export.Resolution150–300分辨率越高文件越大但 300 对 GIS 出图无实质提升export.CompressionQuality75–85JPEG 压缩质量85 是清晰度与体积平衡点export.Vectorizetrue强制矢量化文本/符号避免栅格化导致字体模糊我坚持在每个项目里把ExportToPDF封装成MapExporter类内置重试机制Georeference有时首次失败、自动清理临时文件、并记录导出耗时日志。这看似是小功能但客户验收时指着 PDF 里的坐标拾取功能说“这就是我们要的”那一刻你知道所有踩过的坑都值了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

汽车Bootloader开发指南:从启动流程到UDS刷写与Flash驱动实战

汽车Bootloader开发指南:从启动流程到UDS刷写与Flash驱动实战

做车载ECU开发的朋友,对汽车Bootloader这个词应该都不陌生。说白了,它就是ECU上电后最早运行的一段程序,负责在特定条件下监听刷写请求、把应用软件烧进Flash,或者在正常情况下把控制权交还给App。为什么大家这么关注Bootloader流…

2026/10/4 9:35:29 阅读更多 →
RAG数据导入全攻略:从txt到Markdown的结构化解析

RAG数据导入全攻略:从txt到Markdown的结构化解析

1. 为什么数据导入与解析在我这永远是 RAG 项目的第一优先级1.1 一句大白话:RAG 是给模型配了一位图书馆管理员这几年我落地过的 RAG 项目不算少,有一个规律特别明显:每次迭代一开始大家喜欢调模型、改 prompt、换 vector store,折…

2026/10/4 9:34:29 阅读更多 →
SD卡初始化流程全解析:从协议命令到uboot源码与实测波形

SD卡初始化流程全解析:从协议命令到uboot源码与实测波形

第一次在自制板卡上调 SD 卡启动的时候,我拿着逻辑分析仪盯着 CMD 线上的波形看了整整一下午。CMD0 发出去了,卡没有回应;CMD8 发出去,依旧只有主机侧的帧。当时我甚至怀疑是 uboot 的代码没编对,后来把 SD 卡规范、ub…

2026/10/4 9:34:29 阅读更多 →

最新新闻

场景化AI Agent落地实战:从RAG知识库到私有化部署的工程指南

场景化AI Agent落地实战:从RAG知识库到私有化部署的工程指南

1. 场景化AI Agent到底在解决什么问题1.1 从"通用聊天"到"业务智能体"的认知转变过去两年,大模型最普遍的用法就是打开一个对话框,输入问题,得到一段回答。这种模式在写文案、查资料、做翻译时确实好用,但一旦…

2026/10/4 10:20:04 阅读更多 →
MRAM+8位MCU实战:MR25H40CDF与PIC18F45K50的高可靠工业存储设计

MRAM+8位MCU实战:MR25H40CDF与PIC18F45K50的高可靠工业存储设计

1. 这个组合能做什么:MR25H40CDF 与 PIC18F45K50 的应用背景前一阵在调一块工业采集板,主控是 Microchip 的 PIC18F45K50,数据存储从原来的 SPI EEPROM 换成了 Everspin 的 MR25H40CDF。项目需求很典型:现场设备要记录参数修改、事…

2026/10/4 10:20:04 阅读更多 →
WebSocket聊天室实战:Java Web全双工通信与心跳机制详解

WebSocket聊天室实战:Java Web全双工通信与心跳机制详解

简介:WebSocket聊天室是一套基于JavaScript、jQuery与Java构建的实时通讯项目源码,面向具有Web基础并希望学习双向通信的开发者。项目实现了多人群聊、私人对话与在线客服,前端用jQuery简化DOM与事件处理,后端以Java维护WebSocket…

2026/10/4 10:20:04 阅读更多 →
OpenShell实战:Windows 11经典开始菜单安装与调校

OpenShell实战:Windows 11经典开始菜单安装与调校

前阵子帮同事升级Windows 11,他盯着新系统看了半分钟,蹦出一句:这个开始菜单怕不是设计来考验耐心的。我没多解释,直接给他装了个OpenShell,三十秒后他开始感叹,这才是人用的界面。如果你还没接触过OpenShe…

2026/10/4 10:20:04 阅读更多 →
浏览器端视觉AI实战:YOLO模型在WebGPU/WebGL的推理部署与性能优化

浏览器端视觉AI实战:YOLO模型在WebGPU/WebGL的推理部署与性能优化

说实话,第一次在一台普通笔记本的Chrome标签页里,看到YOLO模型实时框住摄像头画面里的人脸时,我第一反应是刷新了一下页面,确认自己没开什么本地服务。这个动作很典型——干了好几年端侧视觉AI的工程,潜意识里总觉得推…

2026/10/4 10:20:04 阅读更多 →
AI Agent Harness Engineering 后端架构选型:微服务 vs 单体架构的取舍与 TaoToken 统一接入实践

AI Agent Harness Engineering 后端架构选型:微服务 vs 单体架构的取舍与 TaoToken 统一接入实践

/* 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 10:19:04 阅读更多 →

日新闻

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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →