c# - 在 Visual Studio 2015 中调试 native 应用程序加载的托管 DLL

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

我正在使用支持“扩展”作为托管 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/

相关文章:

c# - Kinect SDK播放器检测

c# - 如何使用 SqlConnectionStringBuilder 从连接字符串中获取数据库名称

C# Seeding StaticRandom in parallel.for 以获得可重现的序列

macos - 是否可以在Mac中构建UWP应用?

c# - 如何防止创建处理同一请求的多个后台进程?

c++ - 在嵌套循环中使用 OpenMP reduction 子句

java - "If"语句,常量相等

c++ - LNK2019上一个带dll项目的解决方案

visual-studio - Angular2 - 不会为提前编译生成 ngfactory 文件

asp.net - 无法从 VS2015 运行 IIS Express