Co to jest krosowanie i dlaczego go potrzebujemy?
Trudno mi uwierzyć, że nie mogę wysłać int
połą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.
Odpowiedzi:
Ponieważ różne języki i środowiska mają różne konwencje wywoływania, różne konwencje układu, różne rozmiary prymitywów (por.
char
W C # ichar
C), 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.źródło
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 .
źródło
Marshalling
int
to 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.
źródło
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 .
źródło
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.
źródło
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).
źródło