cad.net dll动态加载之后如何调试
前文提要
目的
本质上来说dll的动态加载是为了不占用文件,不占用文件是为了重复编译,
重复编译是为了不重启cad就可以载入插件来调试,
那么vs要如何调试已经动态加载进来的东西呢?
所以我们此次研究调试[次插件项目].
方法1
高版本cad的话,利用[主插件项目]来调试启动cad,然后将[次插件项目]的dll动态加载进来,
在cad上面敲调试的命令,
恰逢你此时vs有开[次插件项目]就会捕捉到上面的.cs文件,
如果没有开,vs会弹出这个对话框让你找代码文件,就选中cs文件就好了.
它就会击中断点了!!
这里的原理是vs会将所有代码文件缓存在一个储存区,然后通过储存区找.
一旦接受这个设定,请看下一个方法.
方法2
直接启动cad(不调试),
[主插件项目]的dll用netload(或者注册表)加载到cad,再通过它把[次插件项目]的dll用动态加载,
动态加载的方法:
可以做一个netload2命令;
也可以做一个文档栏,然后文档栏可以接受拖入次dll;(可参考我文档栏工程噢)
此时[次插件项目]的dll已经通过字节码加入在托管内存了.(脱钩了)
然后在[cad次插件]的vs工程上面,选择附加进程调试Ctrl+Alt+P, 选择cad附加..
即使当前的dll已经脱钩了,但是仍然可以让vs链接上对应的文件来调试...
其中的原理是vs会检索具有相同GUID的文件?
我也没有懂为什么.....明明代码文件是属于无关的了....高版本却可以连接到,低版本就连接不到.......
调试Acad08不成功
Acad08附加进程调试会这样..(我已经试过很多很多方法了....大家用高版本调试吧......
我试了多少种方法:....
测试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 直接调试。
测试2:
将编译的目标平台设置为X86而不是AnyCPU或者X64
https://www.cnblogs.com/jeffwongishandsome/p/How-To-Solve-App-Break-Mode-Problem.html
测试3:
大家如果能成功也请告诉我...
动态加载之后能干什么
动态加载之后,如果通过代码实现反编译,
那么可以将高版本的dll和低版本的dll加入到你的程序上面,你再通过替换内部函数和配置文件的方式来实现...
明经netloadx实现的是读写每个命令载入到新的程序域.
而往往事情想要做好并没有那么简单,需要自己去实现每句的反编译,再通过反编译替换,
如TextStyle替换成高版本的TextStyleId.
低版本的引用替换成高版本的引用....
不过这个好像刚需性不大..
加上读写il文件是极其复杂的,好在github上面有开源的反编译器ILSpy
所以是能够实现的,就是理解反编译代码都需要耗费点时间...
剩下靠你们辣...
(完)