Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatically creating C# wrappers from c headers?

Tags:

Is there a way to automatically create p/invoke wrappers for .net from a c header?

Of course I could create them by hand, but maintaining them would be painful, and I'd probably make a mistake somewhere resulting in hard to debug crashes.

I tried SWIG, but it created full classes where simple structs would be sufficient. Another problem with SWIG is that it requires additional interop code on the c side.

I'd prefer if the output worked on mono too, but that is not necessary.

Another thing I could work with is a program which parses the c header, and creates an output in a nice intermediate format like xml, from which I can create the C# wrapper myself.

Edit:
PInvoke Interop Assistant is what I needed.
There are some small issues with it though:
* It translates "unsigned char*" to string where I'd prefer IntPtr
* It assumes that size_t=int=long=32bit. This is currently true for me, but might not true on every platform.
Is there a clean way to fix that? Else I'll use a bit of find and replace on the c code before converting it.

like image 959
Winner Avatar asked Mar 25 '10 16:03

Winner


2 Answers

The PInvoke Interop Assistant ought to be a better fit for you, it was specifically designed to work with C code.

Just beware that no tool gives you a 100% guaranteed solution, C declarations are way too ambiguous to guarantee a completely trouble-free result. Trouble caused by pointers, ubiquitous in C code. There's no way to tell that a pointer is used to read or write memory. Or both. Or who is responsible for releasing the memory that is being pointed-to.

This is a major hangup for static code analyzers as well, they can't do a decent job if they don't know how a pointer is used. They can only infer it from usage, but that's a chicken-and-egg problem, the usage might be wrong. Microsoft addressed the problem in their own headers with SAL annotations, extra markup that's neutral to a compiler but can be parsed by a code analyzer. They explicitly state the intended use a pointer.

Also used by the Pinvoke Interop Assistant which is why it can do a better job on winapi declarations. But that of course only works on Microsoft headers, these SAL annotations are normally missing on code written by a busy C programmer.

like image 152
Hans Passant Avatar answered Oct 20 '22 02:10

Hans Passant


If I understand your question correctly, you're basically asking if there is a way to do what SWIG does.

Of course, you want to do it a bit differently, so one option would be to take the SWIG code and change it to work the way you'd like.

like image 22
John Fisher Avatar answered Oct 20 '22 02:10

John Fisher