Reputation:
Is it possible to call C++ code, possibly compiled as a code library file (.dll), from within a .NET language such as C#?
Specifically, C++ code such as the RakNet networking library.
Upvotes: 99
Views: 132071
Reputation: 12826
Yes, it is called P/Invoke.
Here's a great resource site for using it with the Win32 API:
Upvotes: 6
Reputation: 422212
I'm not familiar with the library you mentioned, but in general there are a couple ways to do so:
Upvotes: 9
Reputation: 45533
One easy way to call into C++ is to create a wrapper assembly in C++/CLI. In C++/CLI you can call into unmanaged code as if you were writing native code, but you can call into C++/CLI code from C# as if it were written in C#. The language was basically designed with interop into existing libraries as its "killer app".
For example - compile this with the /clr switch
#include "NativeType.h"
public ref class ManagedType
{
NativeType* NativePtr;
public:
ManagedType() : NativePtr(new NativeType()) {}
~ManagedType() { delete NativePtr; }
void ManagedMethod()
{ NativePtr->NativeMethod(); }
};
Then in C#, add a reference to your ManagedType assembly, and use it like so:
ManagedType mt = new ManagedType();
mt.ManagedMethod();
Check out this blog post for a more explained example.
Upvotes: 104
Reputation: 49199
P/Invoke is a nice technology, and it works fairly well, except for issues in loading the target DLL file. We've found that the best way to do things is to create a static library of native functions and link that into a Managed C++ (or C++/CLI) project that depends upon it.
Upvotes: 12
Reputation: 24478
The technology used to do this is called P/Invoke; you can search for articles on the subject. Note that it is for calling C from C#, not C++ so much. So you'll need to wrap your C++ code in a C wrapper that your DLL exports.
Upvotes: 2
Reputation: 8264
Sure is. This article is a good example of something you can do to get started on this.
We do this from C# on our Windows Mobile devices using P/Invoke.
Upvotes: 2
Reputation: 1202
Have you considered Apache Thrift?
It seems like a very very neat solution.
Upvotes: -3