c# - 从 Visual Studio 2008 中的 C# 应用程序调用时如何调试 C DLL

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

我有一个 C# 窗口应用程序需要使用仅在 C 中提供的第三方 API。为了解决这个问题,我在 VS2008 中创建了三个项目:两个 C# 项目和一个空的 C++ 项目.一个 C# 项目是我的“Wrapper”项目,它只负责生成调用 C DLL 的托管代码。另一个 C# 项目是窗口应用程序,它使用 Wrapper 项目;我们称其为 GUI 项目。

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

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

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

如有任何帮助,我们将不胜感激。以下是我玩过的一些东西,但无济于事:

  • 确保 .pdb 文件与 DLL 文件具有相同的时间戳。在 Google 随机建议“无符号”错误可能由此引起之后,便遵循了此提示。

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

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

最佳答案

您应该检查模块列表(通常在 Visual Studio 的“调试”菜单中找到)以确保:

  • 模块已加载
  • 它正在从正确的地方加载
  • 已正确加载符号

如果窗口列出了模块,但指示未加载符号,则可以通过右键单击模块并选择“加载符号”来强制 VS 加载符号。如果它无法自动找到它们,则会提示您输入路径。

关于c# - 从 Visual Studio 2008 中的 C# 应用程序调用时如何调试 C DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921631/

相关文章:

c# - 如何获得 session 结束的通知?

C# sizeof(enum) 替代方案? (解决 resharper false 错误)?

c - Strncpy 在字符串末尾给出不需要的字符

c - numa、mbind、段错误

c++ - vc6移植到vc2005/vc2008的优势?

c# - 在 VB.NET 中将字符串转换为日期

c# - 以 C/C++ 作为后端的 WinForms 或 WPF 或 Qt for Windows GUI

c# - 为什么委托(delegate)函数引用在作为参数传递时会被垃圾收集?

c - C 线程中 pthread_create 函数的第四个参数的范围

visual-studio-2008 - 一个解决方案中有多少个项目太多了?