用 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 各跑一遍。
