2011-02-04 41 views
9

好的,在解決如何在運行時在正在運行的應用程序中熱加載DLL(請參閱我的previous post)後,我注意到在新加載的DLL中插入的斷點不是擊中。在運行時從另一個AppDomain調試動態加載的DLL

形勢
我有我想要避免終止/重新運行每次我作出改變,以動態加載的DLL(反射)時間

目標
這裏是一個服務器應用程序我試圖做的(我知道這是不可能的本身):

  • 運行Application.exe
  • 載入到它Process.dll在newAppDomain和運行過程
  • 調試Process.dll
  • 卸載Process.dll
  • 編輯處理代碼,重新編譯Process.dll
  • 動態加載它Application.exe
  • 調試Pro cess.dll
  • 等...

問題
我注意到,當Application.exe在調試模式下,從另一個AppDomain中加載代碼啓動不可達由安裝調試Application.exe (我想,如果我只是直接從可執行文件啓動Application.exe,有​​沒有辦法讓VS調試器來調試任何東西,inluding新加載的DLL)

Prossible解決方法
一個解決方法(醜)解決方案是將DLL的「注入」分離成單獨的可執行文件中的正在運行的應用程序,然後由VS調試器監視它們。我承認我有點困惑。 任何高效,乾淨的想法?

+0

這很奇怪。我有一個應用程序服務器,它將應用程序加載到輔助應用程序域中,並且我沒有設置斷點的問題。 Process.dll文件是用於啓動Application.exe的解決方案的類項目的輸出嗎? – 2011-02-04 11:25:02

+0

聽起來像在你引用的問題中,你沒有解決卸載程序集的問題。在這種情況下,由於調試符號不匹配,您的代碼不會中斷。 – 2011-02-04 15:45:14

回答

1

因爲它可以幫助其他人(因爲這是我最喜歡的搜索結果),所以我發現在「其他」項目中添加對DLL的引用使調試被「注入」的程序集成爲可能。雖然我不會像這樣部署我的解決方案,但它確實允許我至少調試正在注入的代碼,以解決其他穩定代碼的問題。這表明IDE在確定組裝標識(或類似標記)時會參考參考。

在這種情況下,DebugBreak()什麼都不做,VS調試器不會在沒有添加引用的情況下發信號通知。我沒有測試,但可以想象任何其他調試器都會發出信號,所以這再次表明IDE明確忽略了信號(其他DebugBreak()的工作很好。)

作爲資深.NET開發人員,我有說這個問題對我來說是新的,也就是說。我會說這是一個安全的選擇,如果我們加載Windows 2000,VS.NET 2001-2002和這個相同的測試代碼,休息信號就好了。

根據OP之前的文章,最有可能的是,被加載的程序集實際上被加載了一個獨特的身份,即使它是相同的程序集,但是從不同的位置/機制加載(例如),CLR將識別它作爲一個獨特的組件,因此IDE也是如此。

某些讀者可能會或可能不會在某些情況下找到LoaderOptimization的值,因爲它們在應用程序域之間加載相同的程序集,並且注意到多次加載相同的程序集。

HTH有人,我被困了大約一個小時。謝謝。