我有一个来自 C++ 的 .dll,我想在 C# 中调试它,但我不知道如何做。
当我编译c++项目时,Visual studio要求我执行一个“.exe”。
我想我必须创建一个项目来执行该dll。
但是我迷失了,我该如何调试它?
如果我理解正确的话,您想在调用您也创建的 DLL 的 C# 项目中调试您创建的 C++ 编码的 DLL?
我之前已经通过进入 C# 项目属性并在“调试”部分下选中“启用非托管代码调试”复选框来完成此操作。这应该允许您进入 C++ DLL。
要从 C# 调试 C++,您必须做几件事。
Visual Studio 无法自行执行 dll。
您需要在 dll 项目的属性中设置将使用 C++ dll 的启动 .exe。您可以通过“属性 --> 调试 --> 命令”来执行此操作,指定将调用您的 dll 的可执行文件的路径以及所需的任何命令行参数。
和 CCicotta 和 Noobie3001 的有用答案,在 Visual Studio 2017 中,在附加到调用 C++ DLL 的正在运行的 C# 进程时,我还必须更改以下内容:在 Debug > 附加到处理...,确保本机代码由附加到:列出
然后我偶然发现
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 语句,而其他人根本没有提到这一点。