views:

227

answers:

4

What is marshalling and why do we need it.

I find it hard to believe that i cannot send an int over the wire from c# to c and have to marshall it. Why cant c# just send the 32bits over with a starting and terminating signal, telling C code that it has received an int. If there are any good tutorials or sites about why we need marshalling and how to use it that would be great. Thank you very much

+5  A: 

Because different languages and environments have different calling conventions, different layout conventions, different sizes of primitives (cf. char in C# and char in C), different object creation/destruction conventions, and different design guidelines. You need a way to get the stuff out of managed land an into somewhere where unmanaged land can see and understand it and vice versa. That's what marshalling is for.

Jason
+1  A: 

Marshalling an int is ideally just what you said: copying the memory from the CLR's managed stack into someplace where the C code can see it. Marshalling strings, objects, arrays, and other types are the difficult things.

But the P/Invoke interop layer takes care of almost all of these things for you.

JSBangs
+1  A: 

Marshalling is a "medium" for want of a better word or a gateway, to communicate with the unmanaged world's data types and vice versa, by using the pinvoke, and ensures the data is returned back in a safe manner.

Hope this helps, Best regards, Tom.

tommieb75
+1  A: 

As Vinko says in the comments, you can pass primitive types without any special marshalling. These are called "blittable" types and include types like byte, short, int, long, etc and their unsigned counterparts.

This page contains the list of blittable and non-blittable types.

Josh Einstein