마샬링 – 그것이 무엇이며 왜 필요한가?


92

마샬링이란 무엇이며 왜 필요합니까?

intC #에서 C로 유선을 통해 전송할 수없고 마샬링해야 한다는 사실을 믿기 어렵 습니다. 왜 C #은 시작 및 종료 신호와 함께 32 비트를 보낼 수 int없습니까?

마샬링이 필요한 이유와 사용 방법에 대한 좋은 튜토리얼이나 사이트가 있다면 좋을 것입니다.


3
사실, 시작 및 종료 신호와 함께 32 비트를 보낼 수 있습니다 . 그것은 int에 대한 자신의 마샬링을 작성하는 것입니다. 그러나 Dictionary <CustomClassA, List <CustomClassB >>를 C 코드에 어떻게 전달합니까?
Vinko Vrsalovic

4
"over the wire"라고 말하면 엔디안이 떠 오릅니다.
user7116 2010

true는 큰 / 작은 Endian 또는 기타 변형을 무시할 수 있습니다.

54
이것은 약간 이상한 질문입니다. 오히려 "우편 시스템이 왜 필요한가요? 우편물 배달원이 서신을 받아 중앙 위치로 가져 가서 수취인에게 배달하는 시스템을 가질 수 있는데?" 하지만 ... 그것은 우편 시스템입니다. 마샬링 시스템 대신 마샬링 시스템이 필요할 때 왜 마샬링 시스템이 필요한지 묻습니다. 질문의 요점을 놓친 것 같습니다. 명확히 할 수 있습니까?
Eric Lippert

1
이것을 이해하는 가장 좋은 방법은 어셈블리에서 "메서드"가 작동하는 방식을 이해하는 것이라고 생각합니다. 마지막 명령어 주소가 스택에 저장되는 방식, 매개 변수가 스택을 통해 전달되는 방식, 스택 포인터 레지스터가 메서드에 의해 수정되는 방식, 명령어 포인터 레지스터가 사용되며, 특히 방법을 구현하기위한 다른 기술에 약간의 차이가있을 수 있습니다. 실제로 "와이어"를 이해하면 질문에 대한 빛을 얻을 수 있습니다.
ylax

답변:


75

언어와 환경에 따라 호출 규칙, 레이아웃 규칙, 기본 요소 크기 ( charC # 및 C 참조 char), 객체 생성 / 파괴 규칙 및 디자인 지침이 다르기 때문입니다. 관리되는 토지에서 관리되지 않는 토지를보고 이해할 수있는 어딘가로 물건을 가져갈 수있는 방법이 필요합니다. 그것이 마샬링의 목적입니다.


25

.NET 코드 (C #, VB)는 CLR ( 공용 언어 런타임 )에 의해 "관리"되기 때문에 "관리"라고합니다.

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

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


11

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

그러나 P / Invoke interop 레이어는 이러한 거의 모든 것을 처리합니다.


2
마샬링이 실제로 복사 작업을하고 있습니까? 저는 실시간 이미지 처리 작업을보고 있으며 메모리에있는 모든 것을 복사 할 필요가 없습니다.
ias apr

7

Vinko가 주석에서 말했듯이 특별한 마샬링없이 기본 유형을 전달할 수 있습니다. 이를 "blittable"유형이라고하며 byte, short, int, long 등과 같은 유형과 서명되지 않은 대응 유형을 포함합니다.

이 페이지에는 blittable 및 non-blittable 유형 목록이 포함되어 있습니다 .


7

마샬링은 핀 보크를 사용하여 관리되지 않는 세계의 데이터 유형과 통신하고 그 반대의 경우에도 더 나은 단어 또는 게이트웨이를 원하기위한 "중간"이며 데이터가 안전한 방식으로 반환되도록합니다.


2

마샬링은 함수의 시그니처를 다른 시스템에있는 다른 프로세스로 전달하며 일반적으로 구조화 된 데이터를 전용 형식으로 변환하여 다른 프로세서 시스템으로 전송할 수 있습니다 (직렬화 / 비 직렬화).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.