cad.net dll动态加载之后如何调试

前文提要

cad.net dll动态加载

目的

本质上来说dll的动态加载是为了不占用文件,不占用文件是为了重复编译,

重复编译是为了不重启cad就可以载入插件来调试,

那么vs要如何调试已经动态加载进来的东西呢?

所以我们此次研究调试[次插件项目].

方法1

高版本cad的话,利用[主插件项目]来调试启动cad,然后将[次插件项目]的dll动态加载进来,

在cad上面敲调试的命令,

恰逢你此时vs有开[次插件项目]就会捕捉到上面的.cs文件,

如果没有开,vs会弹出这个对话框让你找代码文件,就选中cs文件就好了.

img

它就会击中断点了!!

img

这里的原理是vs会将所有代码文件缓存在一个储存区,然后通过储存区找.

一旦接受这个设定,请看下一个方法.

方法2

直接启动cad(不调试),

[主插件项目]的dll用netload(或者注册表)加载到cad,再通过它把[次插件项目]的dll用动态加载,

动态加载的方法:
可以做一个netload2命令;
也可以做一个文档栏,然后文档栏可以接受拖入次dll;(可参考我文档栏工程噢)

此时[次插件项目]的dll已经通过字节码加入在托管内存了.(脱钩了)

然后在[cad次插件]的vs工程上面,选择附加进程调试Ctrl+Alt+P, 选择cad附加..

即使当前的dll已经脱钩了,但是仍然可以让vs链接上对应的文件来调试...

其中的原理是vs会检索具有相同GUID的文件?

我也没有懂为什么.....明明代码文件是属于无关的了....高版本却可以连接到,低版本就连接不到.......

img

img

调试Acad08不成功

Acad08附加进程调试会这样..(我已经试过很多很多方法了....大家用高版本调试吧......

img

我试了多少种方法:....

测试1:

打开 acad.exe.config,内容如下:

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
  </startup>
  <runtime><generatePublisherEvidence enabled="false"/> </runtime>
</configuration>

勾选启用本地代码调试(T),就可以 F5 直接调试。

img

测试2:

将编译的目标平台设置为X86而不是AnyCPU或者X64

https://www.cnblogs.com/jeffwongishandsome/p/How-To-Solve-App-Break-Mode-Problem.html

测试3:

img

大家如果能成功也请告诉我...

动态加载之后能干什么

动态加载之后,如果通过代码实现反编译,

那么可以将高版本的dll和低版本的dll加入到你的程序上面,你再通过替换内部函数和配置文件的方式来实现...

明经netloadx实现的是读写每个命令载入到新的程序域.

而往往事情想要做好并没有那么简单,需要自己去实现每句的反编译,再通过反编译替换,

如TextStyle替换成高版本的TextStyleId.

低版本的引用替换成高版本的引用....

不过这个好像刚需性不大..

加上读写il文件是极其复杂的,好在github上面有开源的反编译器ILSpy

所以是能够实现的,就是理解反编译代码都需要耗费点时间...

剩下靠你们辣...

(完)

posted @ 2020-11-27 21:24  惊惊  阅读(1662)  评论(0编辑  收藏  举报