O que é marshalling e por que precisamos disso?
Acho difícil acreditar que não posso enviar um int
over the wire de C # para C e ter que fazer o empacotamento. Por que o C # não pode simplesmente enviar os 32 bits com um sinal de início e término, informando ao código C que recebeu um int
?
Se houver bons tutoriais ou sites sobre por que precisamos de marshalling e como usá-lo, isso seria ótimo.
Respostas:
Porque diferentes linguagens e ambientes têm diferentes convenções de chamada, diferentes convenções de layout, diferentes tamanhos de primitivos (cf.
char
em C # echar
em C), diferentes convenções de criação / destruição de objeto e diferentes diretrizes de design. Você precisa encontrar uma maneira de retirar o material de uma terra administrada e colocá-la em algum lugar onde a terra não administrada possa ver e entender e vice-versa. É para isso que serve o marshalling.fonte
O código .NET (C #, VB) é chamado de "gerenciado" porque é "gerenciado" por CLR ( Common Language Runtime )
Se você escrever código em C ou C ++ ou assembler, tudo será chamado de "não gerenciado", já que nenhum CLR está envolvido. Você é responsável por toda a alocação / desalocação de memória.
Marshaling é o processo entre o código gerenciado e o código não gerenciado; É um dos mais importantes serviços oferecidos pelo CLR .
fonte
int
Idealmente, organizar um é exatamente o que você disse: copiar a memória da pilha gerenciada do CLR para algum lugar onde o código C possa vê-la. Organizar strings, objetos, arrays e outros tipos são as coisas difíceis.Mas a camada de interoperabilidade P / Invoke cuida de quase todas essas coisas para você.
fonte
Como Vinko diz nos comentários, você pode passar tipos primitivos sem nenhum empacotamento especial. Eles são chamados de tipos "blittable" e incluem tipos como byte, short, int, long, etc. e suas contrapartes não assinadas.
Esta página contém a lista de tipos blittable e não blittable .
fonte
Marshalling é um "meio" na falta de uma palavra melhor ou um gateway, para se comunicar com os tipos de dados do mundo não gerenciado e vice-versa, usando o pinvoke, e garante que os dados sejam retornados de maneira segura.
fonte
Marshalling é passar a assinatura de uma função para um processo diferente que está em uma máquina diferente, e é geralmente implementado pela conversão de dados estruturados em um formato dedicado, que pode ser transferido para outros sistemas de processador (serialização / desserialização).
fonte