在Visual Studio 2015中调试由Native Application加载的托管DLL

时间:2016-04-12 23:39:05

标签: c# c++ visual-studio debugging dll

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

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

在我看来,Visual Studio调试器无法识别我的托管C#代码,即使明显使用了DLL。例如,如果我浏览"模块"查看,我无法在列表中看到我的DLL。

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

有人知道是否有其他方法可以实现这一目标?

2 个答案:

答案 0 :(得分:0)

Visual Studio将把你的DLL放在列表中,如果它已加载,并且程序正在使用普通的.net运行时。如果它正在使用被篡改或单声道的东西,那么它可能不存在。

我不认为你没有非托管程序的来源是这里的问题。 “混合模式”不是您在项目中设置的。这是你为VS设置的东西,知道从VS启动项目时要使用的调试模式。在附加到流程时,您可以选择更多选项,这对您来说非常重要。

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

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

如果你让它自动选择,并且你有一个计时问题(附加vs .net startup vs dll load),那么当你附加时,.net可能无法启动,并且它不知道要附加.net调试器已启用。因此,手动指定它应该有所帮助。

此外,解决调试计时问题时的一个标准技巧是将System.Diagnostics.Debugger.Break()放入c#代码中 - 这将确保您在此时的那一刻就有机会连接Visual Studio '确保你的c#代码在(希望是正常的).net运行时运行。

答案 1 :(得分:0)

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