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

所以是能夠實現的,就是理解反編譯代碼都需要耗費點時間...

剩下靠你們辣...

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM