티스토리 뷰
배열 및 문자열이 포함된 구조체를 마샬링 하기 위해서는 MarshalAsAttribute 특성을 사용하여 포함된 문자열 및 배열을 마샬링 하는 방법을 지정해야한다. 그렇지 않으면 예외가 발생된다. (마샬링 하는 부분은 예외처리가 되어야한다!)
| 마샬링할 데이터 | 비관리 구조체 (C++) | 관리 구조체 (C#) |
| 정수 배열 |
|
|
| 문자 배열 |
|
|
| 문자열의 문자배열 |
|
|
| 문자열의 포인터 |
|
|
문자열을 wchar_t* 로 마샬링할때는 유니코드 문자열에 대한 포인터로 마샬링하는 아래 두가지 특성 중 하나를 선택할 수 있다.
. [MarshalAs(UnmanagedType.LPWStr)]
. [MarshalAs(UnmanagedType.LPTStr)]
구조체 레이아웃 지정
StructLayoutAttribute 특성을 사용하여 플랫폼 호출 마샬러에 대한 구조체의 레이아웃을 설정할 수 있다. (LayoutKind 열거형을 사용)
- Auto : 런타임에서 자동으로 관리되지 않는 메모리에 있는 개체의 멤버에 적합한 레이아웃을 선택한다. 이 열거형 멤버로 정의된 개체는 관리코드 외부에 노출할 수 없다. 노출시 예외가 발생한다.
- Explicit : 관리되지 않는 메모리에 있는 개체의 멤버에 대한 정확한 위치는 명시적으로 제어된다. 각 멤버는 System.Runtime.InteropServices.FieldOffsetAttribute 를 사용하여 형식 내부의 필드위치를 나타내야한다.
- Sequential : 개체의 멤버는 관리되지 않는 메모리로 내보낼때 표시되는 순서대로 배치된다. 멤버는 System.Runtime.InteropServices.StructLayoutAttribute.Pack 에 지정된 방식에 따라 배치되며, 연속되지 않을 수 있다.
[출처] [펌] C# 마샬링|작성자 제노글로시아
http://blog.naver.com/PostView.nhn?blogId=ctpoyou&logNo=111546774
'C#' 카테고리의 다른 글
| WPF OpenFileDialog 창 폴더 선택하기. (0) | 2013.09.16 |
|---|---|
| ListView & TreeView 이만한 더블버퍼링은 없다. (0) | 2013.05.14 |
| 인자 없는 delegate 의 Invoke 쓰기. (0) | 2012.08.21 |
| .NET 4.0 에서 SQLite 쓰기위한 구문 (0) | 2012.08.20 |
| SHA1 해쉬 알고리즘 테스트 (0) | 2012.08.06 |
