本帖最后由 yupeng_dyp 于 2022-9-11 18:12 编辑
由于 .Net CAD 开发调试一直很烦,经常要重启!在网上查了很多的方法,现经测试优化整理出一个可行的方法,不过只能对无依赖的 Dll 文件可以成功,在这里与大家分享交流;而有依赖的暂时还没有找到好的方法,望各位道友共研交流分享。
说明:
TestApp.dll 为要调试的类库
TestApp.ClassMain 为类库中对应的空间名与类名
TestCmd 为要调试执行的方法
上面对应的名称可根据自己的修改就行,把下面的源码单独编译成一个 Dll 然后在 CAD 中加载,另把要调试的 Dll 放到与此 Dll 一个目录就可以了,Json 文件主要用于在不重新编译此 Dll 时,方便修改要调试的 Dll 相应的名称(使用前先安装好 Json 包)
源码如下:
第一次上传,using Autodesk.AutoCAD.Runtime 中好像始终有个自动加的链接,也不知道咋去掉!!!
- using System;
- using System.IO;
- using System.Reflection;
- using Autodesk.AutoCAD.Runtime;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- namespace Acad.Reload;
- public class Reload
- {
- private Action cmd;
- [CommandMethod("RL", CommandFlags.UsePickSet)] //简写命令
- public void RL() { ReloadCmd(); }
- [CommandMethod("Reload", CommandFlags.UsePickSet)] //全写命令
- public void ReloadCmd() {
- var cmdInfo = new CmdInfo("TestApp.dll", "TestApp.ClassMain", "TestCmd"); //目标类库、空间.类、方法的名称
- var dllPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); //当前类库文件所在目录
- var jsonFile = dllPath + "\\Reload.json"; //定义 Json 文件全路径
- //如果 Json 文件存在就读取对应数据
- if (File.Exists(jsonFile)) {
- using var file = File.OpenText(jsonFile);
- using var reader = new JsonTextReader(file);
- var obj = (JObject)JToken.ReadFrom(reader);
- cmdInfo.DllName = obj["DllName"].ToString();
- cmdInfo.ClassName = obj["ClassName"].ToString();
- cmdInfo.MethodName = obj["MethodName"].ToString();
- }
- var adapterFileInfo = new FileInfo(Assembly.GetExecutingAssembly().Location); //获取当前类库文件全路径
- var targetFilePath = Path.Combine(adapterFileInfo.DirectoryName, cmdInfo.DllName); //获取目标类库文件全路径
- var targetAssembly = Assembly.Load(File.ReadAllBytes(targetFilePath)); //将目标类库以二进制形式加载到程序
- try {
- var targetType = targetAssembly.GetType(cmdInfo.ClassName); //定位目标类
- var targetMethod = targetType.GetMethod(cmdInfo.MethodName); //定位目标方法
- var targetObject = Activator.CreateInstance(targetType); //创建目标类
- cmd = () => targetMethod.Invoke(targetObject, null); //cmd指向类中的方法
- cmd?.Invoke(); //执行方法
- }
- catch (System.Exception ex) {
- System.Windows.Forms.MessageBox.Show(ex.Message, "提示");
- }
- }
- }
- public class CmdInfo
- {
- public string DllName { get; set; } //类库文件名
- public string ClassName { get; set; } //空间名.类名
- public string MethodName { get; set; } //方法名
- public CmdInfo(string dllName, string className, string methodName) {
- DllName = dllName;
- ClassName = className;
- MethodName = methodName;
- }
- }
Json 文件内容参考:
- {
- "DllName":"TestApp.dll",
- "ClassName":"TestApp.ClassMain",
- "MethodName":"TestCmd"
- }
复制代码
下面是一个用于自动加载 Dll 的 Lisp 程序用于交流分享,默认文件名为 LoadApp.lsp ,默认加载同目录中 net35 或 net48 目录下的 Reload.dll 文件,可根据自己需要修改,使用时把此程序设为自动加载即可,源码如下:
|