2010-10-13 47 views
2

我有一个C#窗口应用程序,需要使用仅在C中提供的第三方API。为了解决此问题,我在VS2008中创建了三个项目:两个C#项目和一个空的C++项目。一个C#项目是我的“Wrapper”项目,仅负责生成调用C DLL的托管代码。另一个C#项目是窗口化的应用程序,它使用了Wrapper项目;我们称之为GUI项目。如何在从Visual Studio 2008中的C#应用​​程序调用时调试C DLL

在C++项目中,我创建了几个使用第三方API和导出(dllexport)适当函数的C文件(* .c)。我可以成功地将这个项目编译成一个DLL,并且在从我的Wrapper项目中调用这些函数时没有任何问题。如果它是相关的,我的Wrapper项目使用DllImport属性来引用这些函数。

我的C++项目有一个生成后事件,它将生成的DLL复制到我的GUI C#项目的输出目录中,以便它在执行时被拾取。这感觉有点严峻,但这是我想出如何做到这一点的唯一方法。我的GUI项目依赖于我的Wrapper项目,它依赖于C++项目。

然而,我正在努力做的是调试(即逐步)我的C项目代码。我试图在C代码中设置一个断点,希望它能在我的C#代码执行相关函数时被捕获。不幸的是,一旦我运行我的C#应用​​程序,IDE就会警告我将永远不会执行C断点:“没有为此文档加载符号。”

任何帮助,这将不胜感激。这里有一些我玩过的东西,但无济于事:

  • 确保.pdb文件具有与DLL文件相同的时间戳。这个提示之后,随机谷歌建议“无符号”错误可能是由此造成的。

  • 我在C#项目属性中选择了“启用非托管代码调试”。

  • 我已经尝试在调用其中一个DLL方法之前在我的C#调用中设置一个断点,并试图进入DLL。这也不起作用,它只是跨过了功能。

+0

你的意思是.pdb文件不是.pcb – 2010-10-13 07:45:11

+0

我当然可以,已经编辑过。谢谢。 – 2010-10-13 07:49:36

+0

您是否尝试加入C函数?它一直为我工作。 – leppie 2010-10-13 07:51:08

回答

0

您应该检查模块列表(在Visual Studio调试菜单通常发现的),以确保:

  • 模块加载
  • 它被从右侧装入将
  • 的符号已正确放入

如果窗口列出了模块,但表示符号AR en't加载然后你可以强制VS加载符号通过右击模块并选择“加载符号”。如果它不能自动找到它们,那么它会提示你寻找路径。

+0

我们可以在这里获胜。模块列表显示红色感叹号,并警告说二进制文件不是用调试信息构建的。 – 2010-10-13 08:11:29

+0

哎呀,发布太早。无论如何,我试图加载符号文件,它警告我它不匹配。我现在有了这种气味,所以我确信我会随时解决问题。我会将您标记为回复者,因为您已经向正确的方向发送了我。稍后将回复完整答案。 – 2010-10-13 08:12:21

+0

@Duncan - 听起来像你需要检查C++项目的调试信息构建设置。 – Justin 2010-10-13 08:14:25

相关问题