C#开发AutoCAD功能报CS0106、CS8321错误问题求助
报错根因
两个报错是同一个代码结构问题引发的:你把标注了[CommandMethod]的AutoCAD命令方法写在了其他方法的代码块内部,被编译器识别成了C#本地函数。
- CS0106:C#语法规定,嵌套在其他方法内部的本地函数,不能使用
public/private这类访问修饰符,你给本地函数加public修饰符直接违反语法规则 - CS8321:本地函数的作用域仅限声明它的外层方法内部,你既没有在外层方法里调用这个函数,AutoCAD的命令反射机制也扫描不到嵌套在方法内部的函数,因此提示函数声明后从未使用。
修复方案
AutoCAD .NET开发的规则要求,所有带[CommandMethod]特性的命令方法,必须是public类的直接成员,不能嵌套在其他方法、属性的代码块中。修正后的可运行代码结构如下:
using System.IO; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; // 定义public级别的容器类,用来存放所有命令方法 public class CadCommands { [CommandMethod("OpenDrawing", CommandFlags.Session)] // 方法作为类的直接成员,此时使用public修饰符才符合语法 public static void OpenDrawing() { string strFileName = "C:\\DRAFT.dwg"; DocumentCollection acDocMgr = Application.DocumentManager; if (File.Exists(strFileName)) { acDocMgr.Open(strFileName, false); } else { acDocMgr.MdiActiveDocument.Editor.WriteMessage("File " + strFileName + " does not exist."); } } }
后续开发注意点
- 所有自定义AutoCAD命令都要放在public类的根层级,不要写在其他方法的大括号内部
- 命令方法一般标记为
public static即可,不需要类继承特殊接口,AutoCAD就能通过反射识别到加载的命令 - 代码编译成功后,在AutoCAD中用
NETLOAD命令加载生成的dll文件,输入OpenDrawing命令即可执行对应逻辑。
内容的提问来源于stack exchange,提问作者imr5432175
相关产品推荐
相关产品推荐

