最近在研究CAD二次开发过程中,调试代码的过程中,需要频繁地重启CAD,非常浪费我们的开发时间,所以我就一直在想,怎么可以实现在不每次重启代码和CAD的情况下,实现代码的热部署效果。
我找到的方式,就是通过另外一个工具项目,实现对你需要调试的项目的反射,具体操作请看下面。
创建工具项目
引入CAD相关的包
反射代码
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;namespace ribbon_test
{public class LoadX{private Action cmd;[CommandMethod("DD")]public void ReloadX(){string dllName = "E:\\cnet_project\\cad-demo\\bin\\Debug\\ribbon_test.dll";//生成的需要调用的文件名string className = "ribbon_test.Less02_创建对象";//空间名.类名string methodName = "CreatedLine";//method名var adapterFileInfo = new FileInfo(Assembly.GetExecutingAssembly().Location);var targetFilePath = Path.Combine(adapterFileInfo.DirectoryName,dllName);var targetAssembly = Assembly.Load(File.ReadAllBytes(targetFilePath));var targetType = targetAssembly.GetType(className);var targetMethod = targetType.GetMethod(methodName);var targetObject = Activator.CreateInstance(targetType);cmd = () => targetMethod.Invoke(targetObject,null);try{cmd?.Invoke();}catch (System.Exception ex){Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);}}}public class CmdInfo{ public string DllName { get; set; }public string ClassName { get; set; }public string MethodName { get; set; }}
}
在里面 我们需要明确如下几个参数:
dllName :这是我们需要调试的项目构建的位置。
className :这是我们调试项目的类名称,注意要加上空间名称。
methodName :这是我们调试项目,要调试的方法名称。
要调试的项目
具体操作
- 我们首先启动工具项目,让工具项目联动启动CAD。
- 然后加载我们的工具项目dll。
- 然后输入工具命令,我的是DD。
就可以看到如下提示:
表示要调试的项目命令加载成功。 - 如果我们调试代码有所修改,修改完后重新生成方案即可。
- 再一次输入工具命令,重新加载到CAD中。