在C#中调试c++ dll

问题描述 投票:0回答:9

我有一个来自 C++ 的 .dll,我想在 C# 中调试它,但我不知道如何做。

当我编译c++项目时,Visual studio要求我执行一个“.exe”。

我想我必须创建一个项目来执行该dll。

但是我迷失了,我该如何调试它?

c# c++ visual-studio debugging dll
9个回答
46
投票

如果我理解正确的话,您想在调用您也创建的 DLL 的 C# 项目中调试您创建的 C++ 编码的 DLL?

我之前已经通过进入 C# 项目属性并在“调试”部分下选中“启用非托管代码调试”复选框来完成此操作。这应该允许您进入 C++ DLL。


22
投票

要从 C# 调试 C++,您必须做几件事。

  1. 将 C# 项目添加到您的调试应用程序的解决方案中。
  2. 在项目属性的“调试”选项卡上将 C# 项目的属性编辑为“允许非托管代码调试”。
  3. 将 C++ 项目设置为 C# 项目的依赖项。
  4. 在 C# 项目中编写代码以使用 P/Invoke 或 COM 来使用 DLL。
  5. 在 C++ 代码中设置一些断点并运行 C# 项目。

7
投票

我在 Visual Studio 2019 中通过选择“启用本机代码调试”克服了这个问题,如我的 C# 项目属性下所示。

enter image description here


5
投票

Visual Studio 无法自行执行 dll。

您需要在 dll 项目的属性中设置将使用 C++ dll 的启动 .exe。您可以通过“属性 --> 调试 --> 命令”来执行此操作,指定将调用您的 dll 的可执行文件的路径以及所需的任何命令行参数。


1
投票


1
投票
heavyd

CCicottaNoobie3001 的有用答案,在 Visual Studio 2017 中,在附加到调用 C++ DLL 的正在运行的 C# 进程时,我还必须更改以下内容:在 Debug > 附加到处理...,确保本机代码附加到:列出

enter image description here


0
投票
SOS (Son of Strike) 调试扩展 (SOS.dll) 帮助您调试 通过提供有关 Visual Studio 中的托管代码的信息 内部 CLR 环境

请参阅以下文章:-

MSDN 文章


0
投票

0
投票

然后我偶然发现

https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4747?view=msvc-170

它说添加

#pragma unmanaged

消除入口点的警告:

#pragma unmanaged BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) ....

我实际上只想摆脱相应的警告,但是当我启动程序时,我对这个函数内的一些断点最终命中感到惊讶。我尝试了 dll 内的其他断点,但没有命中。然后,我在放置了所需断点的函数上方添加了相同的 pragma 语句:

#pragma unmanaged extern "C" _declspec(dllexport) int Add(Sample* t, int y) { return t->add(y); //<<<<< breakpoint }

断点终于被命中了。

我没有找到任何其他答案来描述这一点,所以也许有人可以向我解释我做错了什么,为什么 pragma 语句让我的断点命中,以及我应该做什么以避免在每个上面添加 pragma 语句我想调试的功能。

我使用 VS2022Community、Target Framework .NET6.0 作为我的 c#side

Enable native code debugging

激活并在c++端创建一个pdb,它与dll一起位于我的c#程序的目录内。从模块中我知道我有正确的 dll,它说符号已加载。但是,如果没有 pragma 语句,则不会命中断点。

现在,我可以处理这个问题。但很高兴知道为什么在我的例子中需要 pragma 语句,而其他人根本没有提到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.