Marshaling - o que é e por que precisamos?

92

O que é marshalling e por que precisamos disso?

Acho difícil acreditar que não posso enviar um intover 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.

ZenLulz
fonte
3
Na verdade, você pode simplesmente enviar os 32 bits com um sinal de início e término. Isso seria escrever sua própria organização para um int. Mas como você passaria um código Dictionary <CustomClassA, List <CustomClassB>> para C?
Vinko Vrsalovic
4
Endianness vem à mente quando você diz "over the wire".
user7116 de
true permite desconsiderar o grande / pequeno Endian ou qualquer outra variação.
54
Esta é uma pergunta um tanto estranha. É como perguntar "por que precisamos de um sistema postal, quando poderíamos simplesmente ter um sistema em que os carteiro colhem a correspondência, a levam para locais centrais para triagem e depois a entregam aos destinatários?" Mas ... isso é um sistema postal. Você pergunta por que precisamos de um sistema de controle quando, em vez disso, poderíamos ter ... um sistema de controle. Acho que estou perdendo o ponto da sua pergunta. Você pode esclarecer?
Eric Lippert
1
Acho que a melhor maneira de entender isso é entender como os "métodos" funcionam na montagem - como o último endereço de instrução é salvo na pilha, os parâmetros são passados ​​pela pilha, o registro do ponteiro da pilha é modificado pelo método, o ponteiro da instrução registro é usado e, em particular, como poderia haver pequenas variações nas diferentes técnicas de implementação de métodos. Na verdade, entender "o fio" deve lançar alguma luz sobre sua pergunta.
ylax

Respostas:

75

Porque diferentes linguagens e ambientes têm diferentes convenções de chamada, diferentes convenções de layout, diferentes tamanhos de primitivos (cf. charem C # e charem 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.

Jason
fonte
25

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 .

Vojta
fonte
11

intIdealmente, 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ê.

JSB ձոգչ
fonte
2
O Marshalling está realmente fazendo operações de cópia? Estou observando operações de processamento de imagens em tempo real e prefiro não ter que fazer cópias de tudo na memória.
ias
7

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 .

Josh
fonte
7

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.

t0mm13b
fonte
2

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).

Maryam Sheikh
fonte