簡體   English   中英

如何從內存中的 DLL 調試 C# 代碼但磁盤中沒有 DLL

[英]How can I debug C# code from DLL in memory but no DLL in Disk

有一個 ac# 應用程序,它編譯存儲在 DB 中的 C# 代碼並使用 roslyn 編譯器在內存中創建一個 DLL,該 DLL 被加載到內存中,並從以下代碼創建該類型的實例

   Activator.CreateInstance(type); // Just creates an instance of the type so that any public method or property can be accessed

將代碼放在 DB 中的原因在此處解釋問題的范圍有點復雜,但重要的是要注意沒有 C# 代碼存在的物理文件。

另請注意,DLL 是在運行時由應用程序在發布模式或調試模式下創建的,具體取決於#ifdebug 是否為真。

現在我們想要的是,如果應用程序在調試模式下運行,我們應該能夠調試在運行時創建的 DLL。 各位高手能不能幫我指點一下如何實現呢。 由於可以從 DB 訪問代碼,如果應用程序在調試模式下運行,我們可以在運行時在某個臨時位置創建一個臨時文件,但是我們如何讓 Visual Studio 知道我們想要將特定的 DLL 鏈接到這個臨時 C# 文件調試的目的。 請注意,DLL 在內存中的某個並發包中,我們也沒有創建 PDB 文件

任何指示都會有所幫助我們正在使用 Visual Studio 2022

這在 Visual Studio 2022 中可能的!

遵循從此答案中發出便攜式 PDB 的指導。 由於您沒有展示太多如何編譯,我會假設它非常接近並且發出源代碼不會成為問題。

當程序集最終加載到程序中時,VS2022 會自動拾取符號。 您可以通過在“ Modules ”窗口中查找您命名的 DLL 來驗證這一點。 Ctrl+Alt+UTools>Windows>Modules 根據我發布的答案,它將隨機命名。

當您運行程序時,外部源節點(VS2022 中的新節點)將顯示相同的隨機 DLL 名稱。

顯示生成的模塊的解決方案資源管理器外部源節點

如果您打開生成的文件,您應該會看到生成的代碼。 您還可以在此文件中放置斷點!

生成的帶有可放置斷點的代碼 被擊中的活動斷點

不確定它是否重要,但在我的 VS 選項中,我禁用了“只是我的代碼”。

我不確定這是否可以通過 Visiual Studio 實現,但也許您可以通過 dnSpy 獲得一些運氣: https ://github.com/dnSpy/dnSpy

我能夠使用以下方法調試程序在運行時加載的 dll:

System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(path);

所以也許它也可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM