Marschall - was ist das und warum brauchen wir es?

92

Was ist Marshalling und warum brauchen wir es?

Es fällt mir schwer zu glauben, dass ich keine intüber den Draht von C # nach C senden kann und sie marshallen muss. Warum kann C # die 32 Bits nicht einfach mit einem Start- und Endsignal senden und C-Code mitteilen, dass es ein empfangen hat int?

Wenn es gute Tutorials oder Websites gibt, warum wir Marshalling benötigen und wie man es verwendet, wäre das großartig.

ZenLulz
quelle
3
In der Tat, Sie können nur die 32 Bits über ein Starten und Beenden Signal senden. Das würde bedeuten, ein eigenes Marshalling für einen Int zu schreiben. Aber wie würden Sie ein Wörterbuch <CustomClassA, List <CustomClassB >> an C-Code übergeben?
Vinko Vrsalovic
3
Endianness kommt mir in den Sinn, wenn Sie "over the wire" sagen.
user7116
true lässt Big / Little Endian oder andere Variationen außer Acht.
54
Dies ist eine seltsame Frage. Es ist eher so, als würde man fragen: "Warum brauchen wir ein Postsystem, wenn wir einfach ein System haben könnten, in dem Briefträger Korrespondenz abholen, zum Sortieren an zentrale Orte bringen und dann an die Adressaten liefern?" Aber ... das ist ein Postsystem. Sie fragen, warum wir ein Rangiersystem brauchen, obwohl wir stattdessen ... ein Rangiersystem haben könnten. Ich glaube, ich vermisse den Punkt Ihrer Frage. Könntest Du das erläutern?
Eric Lippert
1
Ich denke, der beste Weg, dies zu verstehen, besteht darin, zu verstehen, wie "Methoden" in der Assembly funktionieren - wie die letzte Befehlsadresse auf dem Stapel gespeichert wird, Parameter durch den Stapel geleitet werden, das Stapelzeigerregister durch die Methode, den Befehlszeiger, geändert wird Register wird verwendet, und insbesondere, wie es geringfügige Abweichungen bei den verschiedenen Techniken zur Implementierung von Methoden geben kann. In der Tat sollte das Verständnis von "dem Draht" etwas Licht auf Ihre Frage werfen.
Ylax

Antworten:

75

Weil verschiedene Sprachen und Umgebungen unterschiedliche Aufrufkonventionen, unterschiedliche Layoutkonventionen, unterschiedliche Größen von Grundelementen (vgl. charIn C # und charin C), unterschiedliche Konventionen zum Erstellen / Zerstören von Objekten und unterschiedliche Entwurfsrichtlinien haben. Sie brauchen einen Weg, um das Zeug aus verwaltetem Land an einen Ort zu bringen, an dem nicht verwaltetes Land es sehen und verstehen kann und umgekehrt. Dafür ist Marshalling da.

Jason
quelle
25

.NET-Code (C #, VB) wird als "verwaltet" bezeichnet, da er von CLR ( Common Language Runtime ) "verwaltet" wird.

Wenn Sie Code in C oder C ++ oder Assembler schreiben, wird alles als "nicht verwaltet" bezeichnet, da keine CLR beteiligt ist. Sie sind für die gesamte Speicherzuweisung / -freigabe verantwortlich.

Marshaling ist der Prozess zwischen verwaltetem Code und nicht verwaltetem Code. Es ist eine der wichtigsten Dienstleistungen der CLR .

Vojta
quelle
11

Marshalling an intist im Idealfall genau das, was Sie gesagt haben: Kopieren des Speichers vom verwalteten Stapel der CLR an einen Ort, an dem der C-Code ihn sehen kann. Marshalling-Strings, Objekte, Arrays und andere Typen sind die schwierigen Dinge.

Die Interop-Ebene P / Invoke erledigt jedoch fast alle diese Dinge für Sie.

JSB ձոգչ
quelle
2
Führt Marshalling tatsächlich Kopiervorgänge durch? Ich betrachte Bildverarbeitungsvorgänge in Echtzeit und möchte lieber nicht von allem im Speicher kopieren müssen.
ias
7

Wie Vinko in den Kommentaren sagt, können Sie primitive Typen ohne spezielles Marshalling übergeben. Diese werden als "blittable" Typen bezeichnet und umfassen Typen wie Byte, Short, Int, Long usw. und ihre vorzeichenlosen Gegenstücke.

Diese Seite enthält die Liste der blittbaren und nicht blittbaren Typen .

Josh
quelle
7

Marshalling ist ein "Medium" für den Mangel an einem besseren Wort oder einem Gateway, um mithilfe des Pinvoke mit den Datentypen der nicht verwalteten Welt zu kommunizieren und umgekehrt, und um sicherzustellen, dass die Daten auf sichere Weise zurückgegeben werden.

t0mm13b
quelle
2

Marshalling übergibt die Signatur einer Funktion an einen anderen Prozess, der sich auf einem anderen Computer befindet, und wird normalerweise durch Konvertierung strukturierter Daten in ein dediziertes Format implementiert, das auf andere Prozessorsysteme übertragen werden kann (Serialisierung / Deserialisierung).

Maryam Sheikh
quelle