我正在使用支持“扩展”作为托管 C# DLL 的特定应用程序。该应用程序本身是一个 native 应用程序,我没有它的源代码。
我可以让应用程序加载 DLL,并且可以验证是否正在调用我的函数。我想要的是能够在 DLL 运行时调试我的扩展代码。我可以使用 Visual Studio 附加到 native 应用程序的进程,但是,我无法设置任何断点,因为我收到“没有加载任何符号...”错误。 PDB 文件位于 DLL 旁边。
在我看来,Visual Studio 调试器无法识别我的托管 C# 代码,即使显然正在使用 DLL。例如,如果我浏览“模块” View ,我在列表中看不到我的 DLL。
通读一些 Visual Studio 支持页面,听起来好像有一个“混合模式”,我通常会在正在运行的应用程序的项目上启用它。但是,由于我实际上并未构建应用程序,因此无法更改此设置。
有人知道是否还有其他方法可以实现这一目标吗?
最佳答案
如果已加载,Visual Studio 会将您的 DLL 包含在列表中,并且该程序正在使用普通的 .net 运行时。例如,如果它使用的是篡改或单声道的东西,那么它可能不存在。
我不认为你没有非托管程序的源是这里的问题。 “混合模式”不是您在项目中设置的。这是你为 VS 设置的东西,它知道从 VS 启动项目时使用什么 Debug模式。附加到流程时,您可以选择更多选项,这对您来说很重要。
我用这个项目来测试理论:https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0
我构建了 Release模式并删除了 PDB,并且能够使用 VS2015 在 CSClassLibrary(位于 static int GetStringLength
)中设置断点,方法是在附加到进程时手动选择调试器类型。
如果你让它自动选择,并且你遇到了时间问题(附加 vs .net 启动 vs dll 加载),那么 .net 可能在你附加时没有启动,并且它不知道附加.net 调试器已启用。因此手动指定它应该会有所帮助。
此外,解决调试时序问题的标准技巧是将 System.Diagnostics.Debugger.Break() 放入您的 C# 代码中——这将确保您有机会在您需要的那一刻附加一个 visual studio确定您的 C# 代码正在(希望是正常的).net 运行时中运行。
关于c# - 在 Visual Studio 2015 中调试 native 应用程序加载的托管 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585974/