2010-02-10 18 views
63

Was ist Marshalling und warum brauchen wir es?Marshalling - was ist das und warum brauchen wir es?

Es fällt mir schwer zu glauben, dass ich keine int über die Leitung von C# zu C senden kann und Marshall muss. Warum kann C# nicht einfach die 32 Bits mit einem Start- und Beendigungssignal senden, um dem C-Code mitzuteilen, dass er eine int empfangen hat?

Wenn es irgendwelche guten Tutorials oder Websites gibt, warum wir Marshalling und wie man es verwenden soll, das wäre toll.

+2

In der Tat können Sie ** nur die 32 Bits mit einem Start- und Ende-Signal senden. Das würde dein eigenes Marshalling für einen Int schreiben. Aber wie würden Sie ein Dictionary > an C-Code übergeben? –

+2

Endianness kommt dir in den Sinn, wenn du "über den Draht" sagst. – user7116

+0

true lässt große/kleine Endian oder andere Variationen unberücksichtigt. –

Antwort

54

Da verschiedene Sprachen und Umgebungen haben unterschiedliche Aufrufkonventionen, verschiedene Layout-Konventionen, verschiedene Größen von Primitiven (vgl char in C# und char in C), verschiedene Objekterstellung/Zerstörung Konventionen und verschiedene Design-Richtlinien. Du brauchst einen Weg, um das Zeug aus verwaltbarem Land in ein Land zu bringen, wo unkontrolliertes Land es sehen und verstehen kann und umgekehrt. Dafür ist das Marshalling zuständig.

8

Marshalling ein int ist im Idealfall, was Sie gesagt haben: Kopieren Sie den Speicher von der CLR verwalteten Stack an einer Stelle, wo der C-Code es sehen kann. Marshalling Strings, Objekte, Arrays und andere Arten sind die schwierigen Dinge.

Aber die P/Invoke Interop-Schicht kümmert sich um fast alle diese Dinge für Sie.

3

Marshalling ist ein "Medium" aus Mangel an einem besseren Wort oder einem Gateway, um mit den Datentypen der unmanaged Welt und umgekehrt zu kommunizieren, indem der Pinvoke verwendet wird, und sicherstellt, dass die Daten auf sichere Weise zurückgegeben werden.

4

Wie Vinko in den Kommentaren sagt, können Sie primitive Typen ohne spezielles Marshalling übergeben. Diese werden als "blitable" -Typen bezeichnet und umfassen Typen wie "byte", "short", "int", "long" usw. und ihre nicht signierten Gegenstücke.

Diese Seite enthält eine Liste der blittable and non-blittable types.

10

.NET-Code (C#, VB) "verwaltet" genannt wird, weil es von CLR "verwaltet" ist (Common Language Runtime)

Wenn Sie schreiben Code in C oder C++ oder Assembler it all "unmanaged" genannt wird, da keine CLR ist beteiligt. Sie sind für die gesamte Speicherzuweisung verantwortlich.

Marshalling ist der Prozess zwischen verwaltetem Code und nicht verwaltetem Code; Es ist eine der wichtigsten Dienstleistungen von CLR angeboten.