Reputation:
I have a .dll from c++ and I want to debug it in C#, but I don't know how to.
When I compiled the c++ project, Visual studio asked me to execute an ".exe".
I supposed that I had to create a project to execute the dll.
But I am lost, how could I debug it?
Upvotes: 41
Views: 34790
Reputation: 34
I tried every advise here and in some other threads on SO and all over the internet, but no option worked for me to get a breakpoint inside the c++ dll hit.
Then i stumbled upon https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4747?view=msvc-170 where it says to add
#pragma unmanaged
to get rid of a warning for the entry point:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
....
i actually only wanted to get rid of the corresponding warning, but when i started the program, i got surprised by some breakpoint inside this function finally hitting. I tried some other breakpoint inside the dll, but this did not hit. I then added the same pragma statement above the function where i had my desired breakpoint placed:
#pragma unmanaged
extern "C" _declspec(dllexport) int Add(Sample* t, int y) {
return t->add(y); //<<<<< breakpoint
}
and the breakpoint was finally hit.
I did not find any other answer describing this, so maybe someone could either explain to me what i was doing wrong, why the pragma statement made my breakpoints hit after all and what i should do to avoid having to add a pragma statement above every function i want to debug.
I work with VS2022Community, Target Framework .NET6.0 for my c#side with
Enable native code debugging
activated and create a pdb on the c++side, which is inside the directory of my c# program together with the dll. From Modules i know i have the correct dll and it says Symbols loaded. However, without the pragma statement, the breakpoints were not hit.
For now, i can work with that. But it would be nice to know why the pragma statement is needed in my case, whereas other people dont mention this at all.
Upvotes: 0
Reputation: 420
The option "Allow unmanaged code debugging" in the "Debug" tab works for most people, but it doesn't work for me. I have to manually select "Native" as the following to debug c++ dll in my c# code. FYI: I'm using vs2019, and the dll is written with c++ and loaded into C# app with "dllimport".
Upvotes: 0
Reputation: 4002
To complement the useful answers by heavyd and CCicotta and Noobie3001, in Visual Studio 2017 I also had to change the following when attaching to a running C# process calling a C++ DLL: in Debug > Attach to process ..., ensure Native code is listed by Attach to:
Upvotes: 1
Reputation: 1251
I overcame this in Visual Studio 2019 by selecting "Enable native code debugging" as shown under my C# project's properies.
Upvotes: 7
Reputation: 11
For VS 2017 Pro, go to the property page of the main project (your c# project in the solution) by right mouse clicking it. At the Debug menu item, find the option in Debugger engines, choose Enable native code debugging.
Upvotes: 1
Reputation: 77
SOS (Son of Strike) Debugging Extension (SOS.dll) helps you debug managed code in Visual Studio by providing information about the internal CLR environment
refer the below article:-
Upvotes: 0
Reputation: 17721
To debug a C++ from C# there a couple of things you have to do.
Upvotes: 22
Reputation: 50097
Visual Studio cannot execute a dll on its own.
You need to set the startup .exe that will be using your C++ dll in the properties of your dll project. You can do so from properties --> debugging --> command specifying the path of the executable that's gonna call your dll and any command line argument needed.
Upvotes: 5
Reputation: 605
If I understand you correctly, you want to debug a C++ coded DLL that you created, in a C# project that calls the DLL, which you also created?
I've done this before by going into your C# project properties, and under the Debug section, checking the "Enable unmanaged code debugging" check box. This should allow you to step into your C++ DLL.
Upvotes: 47