Marshalling w .NET

0

Witam

Chciałbym się dowiedzieć co nieco o Marshalingu w C#. Owszem czytałem trochę i wiem, że jest to swoistego rodzaju medium, które pozwala na komunikację pomiędzy kodem zarządzanym, a nie zarządzanym. Czyli za pomocą Marshalingu mogę mogę połączyć się z bibliotekami niezarządzanymi w C++/C ? Co oznacz pojęcie "Marshallingu do pamięci niezarządzanej" bo z takim się spotkałem a nie rozumiem terminu ? Fajnie jakby ktoś podzielił się ze mną podstawową wiedzą na ten temat.

Pozdrawiam

0

C# i C++ niezarządzany to dwie różne technologie i pomimo, że w obu technologiach są obiekty podobnych typów, to w pamięci mają różną strukturę, przez co zwykłe przekazanie i rzutowanie może nie być możliwe. Np. String w C# i string w C++ mają odmienną budowę, ale oba obiekty można zapisać jako ciąg bajtów zakończony znakiem 0x00 tak, że jeden wygeneruje taki zapis, a drugi zbuduje obiekt na podstawie tego zapisu.

Marshalling jest wtedy, kiedy obiekt w jednej technologii jest konwertowany na prosty zapis, np. ciąg bajtów lub tekst lub XML, a program lub biblioteka w drugiej technologii zamienia ten prosty zapis na obiekt.

2

Marshallingu do pamięci niezarządzanej" bo z takim się spotkałem a nie rozumiem terminu

jest to automatyczna konwersja typów danych i struktur z nieokreślonej bliżej postaci używanej wewnętrznie przez .NET na ściśle zdefiniowaną postać do wykorzystania przez kod niezarządzany - i odwrotnie.

Wspomniany już string w C# ma swoją wewnętrzną postać, którą jest zapis w kodowaniu UTF-16 (i wcale nie musi być zakończony znakiem zerowym). jeśli funkcja w C++ przyjmuje char*, to w C# trzeba stringa przekonwertować, i marshaller może to zrobić automatycznie przy wywołaniu funkcji natywnej, a nawet przekonwertować z powrotem wartość zwracaną przez funkcję. wygląda to tak jakby ceszarpowy string był tym samym co char* w C (bo przecież wywołanie funkcji działa...) ale tak naprawdę mieliśmy do czynienia z automatyczną konwersją tam i z powrotem.

podobnie bool w C# ma jeden bajt (0 - fałsz, 1 - prawda) ale w WinAPI ma cztery bajty (0 - fałsz, !=0 - prawda). tym też może się zająć marshaller, tak że w C# przesyłasz i odbierasz z funkcji WinAPI zwykłego boola i nie przejmujesz się tym niuansem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1