2016-04-12 104 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加载到内存中时,断点图标应变为红色并按预期工作。

相关问题