使用本机C++,托管c ++ cli和c#解决方案在混合模式下进行调试

jam*_*mie 27 c# c++ debugging c++-cli visual-studio-2010

我有一个多线程项目正在进行中,启动项目设置为运行我的UI的ac #project.然后有一系列基础c ++本机项目通过托管C++/CLI项目连接到C#.我在c#启动项目中启用了"启用非托管调试",当我尝试调试本机代码时,我能够达到我设置的断点.但是,在我尝试再次运行并尝试再次达到断点之后,它会挂起.例如,如果我有一个循环,我尝试在每次迭代中进入它,在第二次迭代后程序挂起并且我必须强制退出.我在Visual Studio 2010中工作.调试开始证明在这个速度下不太有用,有什么方法可以排除这个问题吗?

Tae*_*hin 34

当我想调试本机代码以及C++/CLI时,我会做以下事情:

  1. 在C#应用程序中,检查Allow unsafe code"构建"选项卡和Enable unmanaged code debugging项目属性的"调试"选项卡.
  2. 对于C++/CLI dll项目,在属性的"调试"选项卡中,将"调试器类型"设置为 Mixed

  • "允许不安全的代码"对我来说很关键,我设置了"启用非托管代码"但它仍然会崩溃,直到我还添加了"允许不安全的代码". (2认同)
  • 我有一个C#EXE(用于UI),在本机DLL中使用遗留代码,我创建了一个"shim"C++ CLI DLL来桥接这两个.我在本机代码中设置了断点,但调试器没有停止,即使设置了"启用非托管代码".我为C#项目做了"允许不安全的代码",并在我的C++ CLI DLL和本机DLL(代码在我的解决方案中)中将"Debugger Type"设置为"Mixed"并且瞧 - 我在托管中的断点处停止和*本机代码!好极了! (2认同)

flo*_*d73 8

我们在调试复杂的混合代码应用程序时遇到了问题,并发现Visual Studio在这些情况下并不可靠.我的建议是:

  • 如果您正在尝试调试一段本机代码,请尝试使用本机项目作为调试器启动应用程序.在项目设置下,"调试"选项卡将"调试器类型"设置为"混合",对于我们这有时帮助(例如,本机项目可以是DLL,只需将主Exe设置为项目设置中的调试目标);

  • 使用WinDbg,您可以更加可靠地调试托管/非托管混合代码应用程序;