启用原生代码调试后,仍无法查看托管项目调用的原生代码变量
我之前调试托管+原生代码时也碰到过类似的变量查看失败问题,结合你已经做的设置,下面几个容易忽略的点可以逐一排查:
检查原生DLL的符号文件(.pdb)是否正确加载
调试时打开「模块」窗口(快捷键Ctrl+Alt+U),找到你的原生DLL条目,查看右侧的「符号状态」。如果显示「未加载」,右键点击该DLL选择「加载符号」,手动指定原生项目生成的.pdb文件路径。另外要确保原生DLL和对应的.pdb文件一起复制到了托管项目的输出目录,否则调试器找不到符号信息,自然无法解析变量。关闭「仅我的代码」设置
打开Visual Studio的「工具」→「选项」→「调试」→「通用」,取消勾选「启用仅我的代码」。这个设置会过滤掉非用户编写的代码调试信息,但有时候也会误阻止原生代码的变量查看,即使你已经开启了混合调试。确认原生项目的调试信息生成配置
进入原生项目的属性页:- 在「配置属性」→「C/C++」→「常规」中,将「调试信息格式」设置为「程序数据库(/Zi)」或「编辑并继续的程序数据库(/ZI)」;
- 在「配置属性」→「链接器」→「调试」中,将「生成调试信息」设为「是(/DEBUG)」。
如果原生项目没有生成完整的调试信息,即使断点能命中,也无法解析MyTypeInHere*这类自定义类型的变量。
保证托管与原生项目的调试配置一致
确保你当前调试的是相同配置(Debug/Release)的两个项目。Release模式下编译器会做大量优化,很多调试信息会被剥离,即使开启了调试也无法正常查看变量,一定要切换到Debug配置下调试。清理并重新生成解决方案
有时候旧的编译文件会干扰调试,右键点击解决方案选择「清理」,然后再选择「重新生成」。如果还是不行,可以尝试重置Visual Studio的调试设置(「工具」→「导入和导出设置」→「重置所有设置」),排除调试器配置异常的问题。验证原生DLL的加载路径
通过DllImport加载原生DLL时,确认加载的是你最新编译的版本,而不是系统或其他目录下的旧版本。可以在「模块」窗口中查看DLL的文件路径,确认路径是原生项目的输出目录(或托管项目的输出目录)下的最新文件。
内容的提问来源于stack exchange,提问作者friartuck

