如何在.NET C#中异步调用Lisp函数并避免AutoCAD命令拒绝错误
解决方法
- 核心原因是
Application.Invoke调用时,AutoCAD检测到当前处于命令执行上下文,拦截了Lisp内部的命令调用。你可以先清空命令进行中标记再执行调用:var doc = Application.DocumentManager.MdiActiveDocument; // 清空命令执行标记,绕过上下文校验 doc.Editor.DocumentContext.CommandInProgress = ""; - 不要在同步命令执行栈中直接调用
Application.Invoke,将调用逻辑投递到AutoCAD空闲队列执行,避免上下文冲突,完整示例:var doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.DocumentContext.CommandInProgress = ""; // 注册单次空闲事件执行Lisp调用 Application.Idle += InvokeCustomLisp; void InvokeCustomLisp(object sender, EventArgs e) { Application.Idle -= InvokeCustomLisp; // 构造结果缓冲区,第一个参数为你的Lisp函数名,后续为传入参数 using var rb = new ResultBuffer( new TypedValue((int)LispDataType.Text, "C:MY_CUSTOM_LISP_FUNC"), new TypedValue((int)LispDataType.Double, 100.5) ); Application.Invoke(rb); } - 如果Lisp内部调用的是需要用户交互的命令,可额外设置
doc.Editor.DocumentContext.Interactive = true,调用完成后自动恢复即可。 - 若仍有报错,可修改Lisp代码,将内部的
(command)调用替换为(command-s),该函数是AutoCAD专门提供给二次开发场景的无上下文约束命令执行接口,不会触发命令拦截。
注意事项
- 不需要手动恢复
CommandInProgress属性值,AutoCAD会在Lisp函数执行完成后自动更新。 - 所有调用逻辑必须在AutoCAD主线程执行,上述空闲事件触发时本身就在主线程,无需额外处理线程同步。
内容的提问来源于stack exchange,提问作者OGP99
相关产品推荐
相关产品推荐

