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.
Antworten:
Weil verschiedene Sprachen und Umgebungen unterschiedliche Aufrufkonventionen, unterschiedliche Layoutkonventionen, unterschiedliche Größen von Grundelementen (vgl.
char
In C # undchar
in 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.quelle
.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 .
quelle
Marshalling an
int
ist 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.
quelle
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 .
quelle
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.
quelle
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).
quelle