2016-04-12 153 views
2

我正在使用支持「擴展」作爲託管C#DLL的特定應用程序。應用程序本身是一個本地應用程序,我沒有它的源代碼。在Visual Studio 2015中調試由本地應用程序加載的託管DLL

我能夠讓應用程序加載DLL,我可以驗證我的函數被調用。我想要的是能夠在運行時在DLL中調試我的擴展代碼。我可以使用Visual Studio附加到本機應用程序的進程,但是,我無法設置任何斷點,因爲我得到「沒有符號已被加載...」錯誤。 PDB文件存在於DLL旁邊。

在我看來,即使明確地使用了DLL,Visual Studio Debugger也不能識別我的託管C#代碼。例如,如果我瀏覽「模塊」視圖,我在列表中看不到我的DLL。

通過閱讀一些Visual Studio支持頁面,聽起來好像有一個「混合模式」,我通常會在正在運行的應用程序的項目中啓用。但是,由於我實際上沒有構建應用程序,因此我無法更改此設置。

有誰知道是否有另一種方法來實現這一目標?

回答

0

如果加載了Visual Studio,並且程序使用正常的.net運行時,Visual Studio將在列表中包含您的DLL。如果它正在使用某些篡改或單聲道的東西,那麼它可能不在那裏。

我不認爲你沒有源的非託管程序是這裏的問題。 「混合模式」不是您在項目中設置的項目。這是你爲VS設置的東西,知道從VS啓動項目時要使用哪種調試模式。附加到流程時,您可以選擇更多的選項,這對您來說很重要。

我用這個項目來檢驗這個理論:https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0

我建的釋放模式,並刪除了PDB和使用VS2015通過連接時手動選擇調試器類型是能夠遇到斷點在CSClassLibrary(在static int GetStringLength)到這個過程。

如果你讓它自動選擇,並且你有一個時間問題(附加vs .net啓動與dll加載),那麼.net可能無法啓動,當你連接,它不知道附加啓用.net調試器。所以手動指定它應該有所幫助。此外,解決調試時序問題時的一個標準技巧是將System.Diagnostics.Debugger.Break()放入您的C#代碼中 - 這將確保您有機會在此時添加一個Visual Studio權利,你確定你的C#代碼運行在(希望是正常的).net運行時。

0

當您的DLL尚未被您附加的進程加載時,Visual Studio將顯示該錯誤。只要忽略錯誤並像往常一樣設置斷點即可。當本機應用程序將DLL加載到內存中時,斷點圖標應變爲紅色並按預期工作。

相關問題