netdxf 是最轻量的 dxf 元信息读取方案,可直接解析图层、实体数、单位、创建时间等,无需 autocad;需注意头变量判空、编码设置(如 gbk)及严格模式异常处理。

用 netDxf 读取 DXF 文件元信息最轻量
DXF 是文本可读格式,netDxf 开源库能直接解析图层、实体数、单位、创建时间等基本信息,不依赖 AutoCAD 安装。它适合做批量检查、预处理或轻量 CAD 数据提取。
常见错误现象:NullReferenceException 在调用 DxfDocument.Load 后立刻访问 document.Header —— 实际上部分头变量(如 $INSUNITS)可能未定义,需先判断 document.Header.ContainsKey("$INSUNITS")。
- 使用场景:自动化校验设计院交付的 DXF 是否含标准图层、是否设置毫米单位
-
DxfDocument.Load默认启用严格模式,遇到非标准扩展实体会抛DxfException;加new DxfReaderOptions { IgnoreUnknownRecords = true }更鲁棒 - 性能影响:小文件(DxfDocument.LoadAsync 避免 UI 线程阻塞
读 DWG 必须走 Autodesk RealDWG 或 Teigha(无免费纯托管方案)
C# 原生无法解析 DWG,因为它是二进制加密格式,Autodesk 不开放规范。所谓“免费读 DWG”方案基本是包装了 RealDWG 的 COM 组件(需安装 AutoCAD 或单独部署 RealDWG 运行时),或调用 Open Design Alliance 的 Teigha SDK(商业授权)。
容易踩的坑:AcDbDatabase.ReadDwgFile 报 eNotImplemented 错误——不是代码写错,而是当前 RealDWG 版本不支持该 DWG 的保存版本(比如用 2024 RealDWG 读 2025 新增功能保存的 DWG)。
- 必须匹配 DWG 版本:RealDWG 2023 支持最高到 ACAD2023(即
AC1032),不支持AC1033 - 部署时缺
acdb19.dll或accoreconsole.exe会导致DllNotFoundException,不能只拷 bin 目录,要按官方文档部署整个运行时目录 - Linux/macOS 下完全不可行;.NET Core/.NET 6+ 项目需用 x64 构建并禁用“首选 32 位”
Document.Database.Header 里哪些字段真正可靠
不是所有头变量都默认存在,尤其从第三方软件导出的 DXF/DWG。硬取 $LUNITS 或 $MEASUREMENT 很容易崩,得按实际有无来适配。
实操建议:优先查这四个字段,它们在绝大多数人工绘制文件中稳定存在:
-
$ACADVER:DWG/DXF 版本标识(如AC1027对应 AutoCAD 2013) -
$INSUNITS:插入单位(值为 4=mm,6=m,10=inch),但需 fallback 到$MEASUREMENT(0=英制,1=公制) -
$EXTMIN和$EXTMAX:模型空间范围,类型是Point3d,可算图纸大致尺寸 -
$DWGCODEPAGE:编码页,决定中文图层名/文字能否正确解码(ANSI_1252或ANSI_932)
中文路径或图层名乱码的根源和临时解法
根本原因是 DXF 默认用系统本地编码(如 Windows-1252),而 .NET StreamReader 默认用 UTF-8。RealDWG 自动处理,但 netDxf 需手动指定编码。
错误现象:document.Layers.FirstOrDefault(l => l.Name == "标注") 返回 null,但打印所有图层名看到的是 “æ ‡æ³¨”。
- DXF 加载时传入
Encoding.GetEncoding(936)(GBK)或Encoding.GetEncoding(932)(Shift-JIS) - RealDWG 中文图层名一般没问题,但若
AcDbLayerTableRecord.Name显示方块,检查AcDbDatabase.Textstyle是否缺失仿宋字体定义 - 不推荐全局改系统区域设置,临时解法是在启动 RealDWG 前调用
SetThreadUILanguage(0x0804)(中文简体)
DWG 的版本兼容性和部署约束比想象中更硬,很多“读取成功”的假象来自测试文件恰好匹配了 SDK 版本。真正上线前,务必用客户实际交付的最小/最大/最旧版本 DWG 各跑一遍。










