Points to remember when using p/invoke from C#


This blog post tries to capture some essential points to remember when using p/invoke from C#.

C++

You can expose static methods of a C++ class using the __declspec(dllexport) modifier. The C++ compiler adds each method to the exports table of a DLL with a different name. Use the dumpbin utility (distributed with Visual Studio) to get the exported name of a method and add an EntryPoint field to the DllImport attribute. Dependency Walker is another good tool that shows the exports.

Calling conventions

Read this article that describes the different calling conventions in great detail. If you haven’t messed around with calling conventions in your VC++ code, either by using __stdcall, __cdecl etc in your code, or by changing the compiler setting, you should remember to set the CallingConvention field in the DllImport Attribute to CallingConvention.Cdecl.

Callback using delegates

I refer you to this article that demonstrates passing delegates. In particular, it shows the right calling convention for .NET delegates i.e. __stdcall. If you have only the binaries for a DLL, you can tell C# to use CallingConvention.Cdecl using the UnmanagedFunctionPointerAttribute for the delegate. Note that you need to create a new instance of the delegate and pass that in your p/invoke call. Passing the method name can lead to a hard to decipher System.AccessViolationException.

Marshalling or type mapping

This article has a table of type mappings and other tips regarding marshalling. In case you need to pass or receive an array of bytes (char* in C or C++) or any opaque pointer, the IntPtr structure can be used. Use the Copy method from the System.Runtime.InteropServices.Marshal class to recover data as an array of bytes.

P/Invoke Interop Assistant

The P/Invoke Interop Assistant tool is very useful, it automatically generates C# p/invoke declarations for type and function declarations in C and C++. Red Gate has a free plugin for Visual Studio that can help you to find and contribute p/invoke signatures for well known APIs.


About these ads
Posted in .NET
2 comments on “Points to remember when using p/invoke from C#
  1. dave20120101 says:

    With P/Invoke, You can do more than what you have listed above, see the post here,

    http://www.xinterop.com/index.php/2013/04/13/introduction-to-c-pinvoke-interop-sdk/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 66 other followers

%d bloggers like this: