[英]C# How Can I Play A Video From A Memory Stream Using DirectShow(quartz.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+U
或Tools>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.