AutoCAD .NET API 必须在 ObjectARX 宿主环境中运行,不能直接在控制台或 WinForms 中调用;需通过 netload 加载强签名 DLL,以 [CommandMethod] 标记命令入口,Attach 到 acad.exe 调试,并严格匹配 AutoCAD 版本与 SDK。

AutoCAD .NET API 必须用 ObjectARX 宿主环境运行
直接在普通控制台或 WinForms 项目里调用 Autodesk.AutoCAD.ApplicationServices.Core.Application 会抛出 System.NullReferenceException 或 Autodesk.AutoCAD.Runtime.Exception: eNotApplicable —— 因为这些类不是独立库,而是 AutoCAD 进程内托管扩展的入口门面。
- 必须通过 AutoCAD 加载 DLL:把程序集放在支持路径(如
Acad.exe同级的Support文件夹,或注册到acad.lsp的(netload)路径) - 入口点只能是标记
[CommandMethod]的静态方法,不能靠Main()启动 - 调试必须 Attach 到正在运行的
acad.exe进程,不能直接 F5 运行 - 目标框架严格匹配 AutoCAD 版本:2021–2024 对应 .NET 5/6/8,但需用对应版本的
AutoCAD.NET SDKNuGet 包(如AutoCAD.NET.2024),混用会报Could not load file or assembly
CommandMethod 参数决定命令可见性与执行上下文
[CommandMethod] 不只是“让函数变命令”,它的字符串参数控制命令是否出现在命令行、是否支持透明调用、是否允许在块编辑器中运行。
-
[CommandMethod("MyCmd")]:命令行输入MyCmd可触发,但不支持透明(如不能在画线中途输入) -
[CommandMethod("MyCmd", CommandFlags.Transparent)]:支持透明调用,但此时Application.DocumentManager.MdiActiveDocument可能为 null,需先检查 -
[CommandMethod("MyCmd", CommandFlags.UsePickSet)]:自动继承当前选择集,避免重复调用Editor.SelectAll() - 多个同名命令会冲突;不同组别可用
[CommandMethod("Group1", "MyCmd")]隔离,命令行仍输MyCmd
Document.Transaction 和 Editor.GetSelection 的坑最多
事务(Transaction)不是数据库事务,它和 Editor 实例强绑定于当前文档上下文。常见错误是跨文档操作或在事务外读取实体属性。
- 务必用
doc.Database.TransactionManager.StartTransaction(),而不是 new Transaction() —— 后者不会被 AutoCAD 管理,提交时静默失败 -
Editor.GetSelection()返回的是SelectionSet,但内部对象 ID 在事务提交前不可读取属性(会抛eWasErased);必须先tr.GetObject(id, OpenMode.ForRead) - 修改图元后,记得
ent.RecordGraphicsModified(true),否则视图不刷新(尤其对BlockReference内部属性) - 批量操作优先用
Database.AddNewlyCreatedDBObject(),比反复AppendEntity()+tr.AddNewlyCreatedDBObject()更快且不易漏提交
调试时“命令未加载”往往卡在程序集签名或权限
即使 netload 显示成功,命令也不出现?大概率是程序集没通过 AutoCAD 的强名称验证或 Windows SmartScreen 拦截。
- AutoCAD 2022+ 默认要求程序集带强名称(Strong Name);用
sn -k key.snk生成密钥,项目属性 → 签名 → 勾选并指定文件 - 若提示“无法加载程序集”,检查事件查看器 Windows 日志 → 应用程序,找
AssemblyLoadException详情,常因依赖项(如 Newtonsoft.Json)版本冲突 - 开发机若启用了 Windows Defender Application Control(WDAC),需临时禁用或添加策略白名单,否则
netload直接静默失败 - 命令名含空格或特殊字符(如
My-Cmd)会导致netload成功但命令不可见,只支持字母、数字、下划线
最麻烦的永远不是写代码,而是让 AutoCAD 承认你写的代码真正在它进程里跑起来了——签名、路径、调试 Attach、事务生命周期,四个环节错一个,命令就消失。


















