(Originally written October 5, 2009)
In a previous post I pointed out some resources to help write PInvoke signatures to call platform functions from C# or VB.NET code. This type of interop can also be used to introduce C#/VB.NET code to an application not using the .NET Framework. For example perhaps a new GUI can be written in C# that reads and writes data using an existing C++ database layer. This form of interop is useful if you:
- Need to call unmanaged code from C# or VB.NET
- Have control over the unmanaged C/C++ codebase
- Don’t have or don’t want to use a COM interface
- Can reduce your module’s interface to C functions (PInvoke provides limited object oriented support, essentially whatever you can do with structs and no classes)
Below is very well near the simplest possible example.
First create a Win32 DLL project in Visual Studio and add the code below, a single trivial function. The “__declspec(dllexport)” exports the function from the DLL allowing outside modules to call it and the “extern “C”” prevents C++ name mangling.
return a + b;
Next create a C# project (or VB.NET if you prefer). If you are already experienced with platform-invoking Windows functions this code will be familiar. Lines 8 and 9 import the function from the DLL created above. See my previous post linked above for more resources on PInvoke signatures.
static void Main(string args)
static extern int Add(int a, int b);
To run the code both the DLL from the first step and the EXE from the second step must be in the same folder. However its possible to dynamically load the unmanaged DLL from a different folder using LoadLibrary from the C# EXE. Simply ensure that you call LoadLibrary to correctly load the DLL before making any calls to the functions exported by the DLL.