如何从C#项目中调试C++ DLL?

5
我创建了一个Visual C++ 6.0 DLL项目,并从我的C#代码中使用它。现在我想要调试这个DLL,但我无法做到。
我选择以下选项来完成它:
1、在我的Visual C++项目代码中放置断点。 2、构建DLL并将其复制到我的C#项目目录中。 3、现在我构建我的C#项目,dll工作得很好(方法调用完美)。 4、现在我想要调试这个DLL。 5、我遵循一个博客并打开C++项目,选择VC++中的“附加到进程”。 6、但是我没有找到Visual C#项目的运行进程,而它在任务管理器进程中可用。
在我的C#项目解决方案中,我有两个项目:
1、Web服务(在访问URL时调用DLL方法) 2、另一个是Web表单应用程序,它启动了Web服务。
现在请告诉我如何调试我的DLL。我已经遵循了很多博客,但所有这些博客都集中在“附加到进程”方法上,而这种方法在我的情况下不起作用。我该怎么办?
2个回答

9

你需要启用非托管调试,因为你的主要程序是托管程序,所以在任何一种情况下都不会默认开启。

在C#项目中,你可以通过选择 项目 > 属性 > 调试标签 > 勾选 "启用非托管代码调试" 复选框来完成这个操作。

你也可以通过选择 工具 > 附加到进程,并点击选择按钮来实现。选择 "调试这些代码类型" 单选框并勾选 托管和本地代码。如果你的进程是64位的,则只能使用本地代码进行调试。

在 DLL 的源代码中设置断点,并确保编写的 C# 代码能够运行 DLL 函数。如果你仍然无法获取断点,请使用 调试 > 窗口 > 模块 并确认你在模块列表中看到了这个 DLL。在它上面右键单击,选择 符号加载信息,以获取更多的故障排除信息,其中显示了调试器查找 PDB 文件的跟踪信息。


我试图取消托管调试,但是我有一个Web服务项目和一个窗体应用程序在我的解决方案中。我在第二个项目中启用了它,但在第一个项目中没有找到任何这样的选项。 - Amit Pal
注意:在我使用的 Visual Studio (2012) 版本中,该选项被称为“启用本机代码调试”。 - wip
“启用非托管代码调试”选项在Visual Studio 2012中不可用。它与“启用本机代码调试”是相同的吗? - Niloofar

0

你可以将C++项目添加到你的C#解决方案中,并直接引用该项目(而不是dll),这样你就不需要复制DLL文件了。之后,只需正常调试(F5)你的C#项目,断点也会对C++项目起作用。这种方式非常适合调试。我已经尝试过这种调试方法,并没有更改任何其他设置。


但是为了做到这一点,我必须更改所有写在C#项目中的代码流程。 - Amit Pal
我不确定为什么你需要改变代码流程,你只需要将DLL引用更改为项目引用。或者是我漏掉了什么? - SergeyS
是的,有问题,因为我有一个与Visual C++项目相关联的.lib文件。 - Amit Pal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接