views:

101

answers:

4

I know that it's possible to compile my C code into a dll, and then use P/Invoke to call that code.

What I wondered if it was possible to have a chunk of C code embedded directly in my code, perhaps only available to one class...

Something like this (non-working) example:

public class MyClass {
    extern "C" {
        int do_something_in_c(int i) {
            return i*2;
        }
    }

    public int DoSomething(int value) {
        return do_something_in_c(value);
    }
}

I've been trying for a few hours using Visual Studio 2008, but I'm not getting anywhere, and I suspect that it isn't actually possible. Can anyone confirm or deny this?

Thanks.

+3  A: 

It's not possible. While C# supports unsafe code (pointers), it is not backwards compatible with C or C++

Richard Szalay
+4  A: 

It is possible to create a mixed-mode assembly (that is, one that has both managed and native code), but only the C++/CLI compiler can produce one of these. What you're looking to do is not supported by the C# compiler.

Steve Dennis
A: 

IMHO, it is not possible, since C is an unsafe and unmanaged language. Besides, C# has all the important features of C except pointers.

Salil
C# does support pointers - http://msdn.microsoft.com/en-us/library/aa664769(v=VS.71).aspx
Richard Szalay
My bad.. But i didn't consider it since it's unsafe.
Salil
A: 

You can write and compile your C code as a normal (non-.NET) assembly, then P/Invoke it

[DllImport ("mylib.dll")]
private static extern int do_something_in_c(int i);

public int DoSomething(int value)
{
    return do_something(value);
}
stephane.delcroix
The OP mentions this in the first line of the question.
Richard Szalay
Yes. I did this originally. But it seemed somehow inelegant. :)
Jonathan