Marshaling - co to jest i dlaczego go potrzebujemy?

93

Co to jest krosowanie i dlaczego go potrzebujemy?

Trudno mi uwierzyć, że nie mogę wysłać intpołączenia z C # do C i muszę to zorganizować. Dlaczego C # nie może po prostu wysłać 32 bitów z sygnałem początkowym i końcowym, informując kod C, że otrzymał int?

Jeśli są jakieś dobre samouczki lub strony o tym, dlaczego potrzebujemy krosowania i jak z niego korzystać, byłoby świetnie.

James
źródło
3
W rzeczywistości możesz po prostu wysłać 32 bity z sygnałem początkowym i końcowym. To by było napisanie własnego uporządkowania dla int. Ale w jaki sposób można przekazać Dictionary <CustomClassA, List <CustomClassB>> do kodu C?
Vinko Vrsalovic
4
Endianness przychodzi na myśl, kiedy mówisz „over the wire”.
user7116
true pomińmy duży / mały Endian lub jakąkolwiek inną odmianę.
55
To trochę dziwne pytanie. To raczej jak pytanie „po co nam system pocztowy, skoro moglibyśmy po prostu mieć system, w którym listonosze odbierają korespondencję, zabierają ją do centralnych lokalizacji w celu sortowania, a następnie dostarczają do adresatów?” Ale ... to jest system pocztowy. Pytasz, dlaczego potrzebujemy systemu krosowego, skoro zamiast tego moglibyśmy mieć ... system krosowy. Myślę, że brakuje mi sensu twojego pytania. Możesz wyjaśnić?
Eric Lippert
1
Myślę, że najlepszym sposobem na zrozumienie tego jest zrozumienie, jak "metody" działają w asemblerze - jak ostatni adres instrukcji jest zapisywany na stosie, parametry są przekazywane przez stos, rejestr wskaźnika stosu jest modyfikowany metodą, wskaźnik instrukcji rejestru, aw szczególności, w jaki sposób mogą wystąpić niewielkie różnice w różnych technikach wdrażania metod. W efekcie zrozumienie „drutu” powinno rzucić trochę światła na twoje pytanie.
ylax

Odpowiedzi:

76

Ponieważ różne języki i środowiska mają różne konwencje wywoływania, różne konwencje układu, różne rozmiary prymitywów (por. charW C # i charC), różne konwencje tworzenia / niszczenia obiektów i różne wytyczne projektowe. Potrzebujesz sposobu na przeniesienie rzeczy z zarządzanej ziemi w miejsce, w którym niezarządzana ziemia może to zobaczyć i zrozumieć i odwrotnie. Do tego służy krosowanie.

Jason
źródło
26

Kod .NET (C #, VB) jest nazywany „zarządzanym”, ponieważ jest „zarządzany” przez CLR ( Common Language Runtime )

Jeśli piszesz kod w C, C ++ lub asemblerze, to wszystko jest nazywane „niezarządzanym”, ponieważ nie jest zaangażowany żaden CLR. Jesteś odpowiedzialny za przydzielanie / cofanie alokacji pamięci.

Marshaling to proces między kodem zarządzanym a kodem niezarządzanym; Jest to jedna z najważniejszych usług oferowanych przez CLR .

Vojta
źródło
11

Marshalling intto idealnie właśnie to, co powiedziałeś: kopiowanie pamięci z zarządzanego stosu CLR do miejsca, w którym kod C może ją zobaczyć. Marshalling ciągów, obiektów, tablic i innych typów to trudne rzeczy.

Ale warstwa międzyoperacyjna P / Invoke załatwia prawie wszystkie te rzeczy za Ciebie.

JSB ձոգչ
źródło
2
Czy Marshalling faktycznie wykonuje operacje kopiowania? Patrzę na operacje przetwarzania obrazu w czasie rzeczywistym i wolałbym nie robić kopii wszystkiego w pamięci.
MSR
7

Jak Vinko mówi w komentarzach, można przekazywać typy prymitywne bez specjalnego krosowania. Są to nazywane typy „blittable” i obejmują typy takie jak bajt, short, int, long itp. Oraz ich odpowiedniki bez znaku.

Ta strona zawiera listę typów kopiowalnych i niekopiowalnych .

Josh
źródło
7

Marshalling jest „medium” z braku lepszego słowa lub bramy, aby komunikować się z typami danych niezarządzanego świata i odwrotnie, używając pinvoke, i zapewnia, że ​​dane są zwracane w bezpieczny sposób.

t0mm13b
źródło
2

Marshalling to przekazanie sygnatury funkcji do innego procesu, który znajduje się na innej maszynie i jest zwykle realizowany poprzez konwersję danych strukturalnych do dedykowanego formatu, który można przesłać do innych systemów procesorów (serializacja / deserializacja).

Maryam Sheikh
źródło