前文提要
目的
本質上來說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
所以是能夠實現的,就是理解反編譯代碼都需要耗費點時間...
剩下靠你們辣...
(完)