2010-02-10 6 views
63

마샬링이란 무엇이며 마샬링이 필요한 이유는 무엇입니까?마샬링 - 왜 그게 무엇이며 왜 필요합니까?

int을 C#에서 C로 보낼 수없고 마샬링해야한다고 생각하기가 어렵습니다. 왜 C#은 시작과 종료 신호로 32 비트를 보내고 C 코드에 int을 받았음을 알리지 못합니까?

마샬링이 필요한 이유와 사용 방법에 대한 훌륭한 자습서 나 사이트가있는 경우 좋을 것입니다.

+2

사실 ** 시작 및 종료 신호로 32 비트를 보낼 수 있습니다. 그건 int에 대한 자신의 마샬링을 작성하는 것입니다. 하지만 사전 >를 C 코드에 어떻게 전달합니까? –

+2

"철저히"라고 말하면 엔딩 아는 마음이 떠오릅니다. – user7116

+0

true로 설정하면 크고 작은 엔디안 또는 다른 변형을 무시합니다. –

답변

54

다른 언어와 환경이 서로 다른 호출 규칙, 다른 레이아웃 규칙, 프리미티브 (C#에서 참조 char 및 C char)의 다른 크기, 다른 객체 생성/파괴 규칙 및 다른 디자인 가이드 라인을 가지고 있기 때문에. 관리되는 토지를 관리되지 않는 토지에서 볼 수 있고 이해할 수있는 곳으로 물건을 가져 오는 방법이 필요합니다. 마샬링이 그 때문입니다.

8

마샬링 int은 CLR의 관리 스택에서 C 코드가 볼 수있는 곳으로 메모리를 복사하는 것이 이상적입니다. 문자열, 객체, 배열 및 기타 유형을 정렬하는 것은 어려운 작업입니다.

그러나 P/Invoke interop 계층은 이러한 모든 사항을 처리합니다.

3

마샬링은 pinvoke를 사용하여 관리되지 않는 세계의 데이터 형식과 통신하거나 더 나은 단어 또는 게이트웨이를 원하는 "보통"이며 데이터가 안전한 방식으로 반환되도록합니다.

4

Vinko가 주석에서 말하듯이 특별한 마샬링없이 기본 유형을 전달할 수 있습니다. 이것들은 "blittable"타입이라고 불리며, byte, short, int, long 등과 같은 타입과 부호없는 대응 타입을 포함합니다.

이 페이지는 blittable and non-blittable types의 목록을 포함합니다. 이 CLR에 의해 "관리"있기 때문에

10

.NET 코드 (C#을, VB)은 "관리"라고합니다 (Common Language Runtime)

당신은 C 또는 C++ 코드를 작성하는 경우 또는 이후,이 모든 "관리되지 않는"라고 어셈블러 CLR이 없습니다. 모든 메모리 할당/할당 해제에 대한 책임은 귀하에게 있습니다.

마샬링은 관리 코드와 비 관리 코드 간의 프로세스입니다. CLR에서 제공하는 가장 중요한 서비스 중 하나입니다.

관련 문제