在Visual Studio 2015中调试本机应用程序加载的托管DLL

Debug a Managed DLL loaded by Native Application in Visual Studio 2015

本文关键字:加载 DLL 应用程序 本机 Studio Visual 2015 调试      更新时间:2023-10-16

我正在使用一个特定的应用程序,该应用程序支持作为托管C#DLL的"扩展"。应用程序本身是一个本地应用程序,我没有它的源代码

我能够让应用程序加载DLL,并且我可以验证我的函数是否被调用。我想要的是能够在DLL运行时调试我的扩展代码。我可以使用Visual Studio附加到本机应用程序的进程,但是,当我收到"没有加载符号…"错误时,我无法设置任何断点。PDB文件位于DLL旁边。

在我看来,Visual Studio调试器似乎无法识别我的托管C#代码,尽管DLL显然正在使用中。例如,如果我浏览"模块"视图,我将无法在列表中看到我的DLL。

阅读一些VisualStudio支持页面,听起来有一个"混合模式",我通常会在运行应用程序的项目上启用它。但是,由于我实际上并没有构建应用程序,因此无法更改此设置。

有人知道是否还有其他方法可以做到这一点吗?

Visual studio将在列表中显示您的DLL(如果已加载),并且程序使用的是正常的.net运行时。例如,如果它使用的是经过篡改的或单声道的东西,那么它可能不存在。

我不认为你没有非托管程序的源代码是这里的问题。"混合模式"不是您在项目中设置的。这是您为VS设置的,以了解从VS启动项目时使用的调试模式。在附加到进程时,您可以选择更多选项,这对您来说很重要。

我用这个项目来检验这个理论:https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0

我构建了发布模式并删除了PDB,并且能够在附加到进程时手动选择调试器类型,从而使用VS2015在CSClassLibrary(位于static int GetStringLength)中找到断点。

如果你让它自动选择,并且你有一个时间问题(连接与.net启动与dll加载),那么在你连接时.net可能不会启动,并且它不知道在启用.net调试器的情况下连接。因此,手动指定它应该会有所帮助。

此外,在解决调试时序问题时,一个标准的技巧是在c#代码中放入System.Diagnostics.Degger.Break(),这将确保当您确信您的c#代码正在(希望是正常的).net运行时,您有机会连接visual studio。

Visual Studio将在连接到的进程尚未加载DLL时显示该错误。只需忽略该错误并像往常一样设置断点。当本机应用程序将DLL加载到内存中时,断点图标应变为红色并按预期工作。