马歇尔-它是什么,为什么我们需要它?

什么是编组? 我们为什么需要它?

我发现很难相信,我不能发送一个 int通过电线从 C # 到 C,必须马歇尔它。为什么 C # 不能只发送一个开始和结束信号的32位,告诉 C 代码它已经收到了一个 int

如果有任何关于我们为什么需要编组以及如何使用它的好的教程或站点,那将是非常棒的。

63055 次浏览

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.

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.

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.

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.

.NET code(C#, VB) is called "managed" because it's "managed" by CLR (Common Language Runtime)

If you write code in C or C++ or assembler it is all called "unmanaged", since no CLR is involved. You are responsible for all memory allocation/de-allocation.

Marshaling is the process between managed code and unmanaged code; It is one of the most important services offered by the CLR.

Marshalling is passing signature of a function to a different process which is on a different machine, and it is usually implemented by conversion of structured data to a dedicated format, which can be transferred to other processor systems (serialization / deserialization).