2

我有一个用 c# 编写的测试应用程序,它调用 c++/cli 中的函数。

c++/cli 函数然后调用 c++ 代码中的函数。

我有三个项目:

调用 c++/cli 代码的 c# 项目。

包装 c++ 代码的 c++/cli 项目。

然后全部构建广告调试。

在 c# 中,我有这样的代码:

var myFile=MyFileWrapper.MyFileWrapper.ReadMyFile(@"C:\tmp\MyFile.bin");

在 c++/cli 我有这样的代码:

MyFileWrapper^ MyFileWrapper::ReadMyFile(System::String ^fileName)
{
      auto nativeMyFile=MyFile::ReadMyFile((char *) System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(fileName).ToPointer());
     MyFileWrapper^ MyFileWrapper=gcnew MyFileWrapper();
     int x=nativeMyFile->Width;
      // do some work
     return MyFileWrapper;
}

在 c++ 中我有这个代码:

MyFile* MyFile::ReadMyFile(char * FileName)
{
      auto myFile=new MyFile();
      myFile->Width=100;
      myFile->Height=200;

      return myFile;
}

当我尝试调试系统时,我可以从 C# 代码步入 c++/cli,但我不能从 C++/CLI 代码步入 c++ 代码。

当我尝试在 c++/cli 中观看 nativeMyFile 时,我可以看到它的地址,但看不到它的类型或数据(例如,nativeMyFile-> 宽度在观察窗口中生成错误。

检查 X 的值时,为 100,表示通过了正确的值。

为什么我不能从 c++/cli 代码进入 C++ 代码?

为什么我看不到 C++ 代码中定义的对象?

4

1 回答 1

4

不支持从托管代码单步执行本机代码。从 C# 到 C++/CLI 代码不是问题,因为它们都是托管代码。但是 C++/CLI 到本机 C++ 无法正常工作。您必须在要调试的本机 C++ 代码上设置断点。当断点命中时,调试器将执行必要的模式切换以匹配代码类型。

在这种情况下,您还需要启用非托管调试,因为您启动了 C# 项目,所以默认情况下不会启用它。右键单击您的 EXE 项目,属性,调试选项卡,勾选选项。当您开始调试时,您的 C++ 代码中的断点将显示为黄色,一旦加载本机代码并设置断点,它就会变为纯红色。

于 2013-06-19T12:02:45.967 回答