2009-08-06 5 views
7

당신은 그 배열의 크기는 (너비 x 높이) 제출 이미지알 수없는 배열의 크기를 마샬링

그래서에 따라,

byte[] 

그러나 바이트 배열을 취하는 구조를 가지고 ... 어떻게 당신은

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

이 바이트 배열은 C DLL을로 C#을에서 전달되는 작업을 할 때이 있어야합니다 sizeconst가해야합니까?

+0

맞춤 마셜 러가 유일한 선택 인 것 같습니다. – IllidanS4

답변

2

마샬링 유형을 변경해야합니다. ByValArray로 정렬하는 경우 SizeConst가 필요하지만 다른 형식에서는 정렬하지 않아야합니다. 자세한 내용은 UnmanagedType enum을 참조하십시오. ,

[MarshalAs(UnmanagedType.LPArray)] 

이 통해 표준 C 배열 (BYTE의 *)에 마샬에 발생할 수 있으므로 포인터 만이 전달됩니다

내 의심 당신이 배열의 C 포인터로 마샬링하려는 것입니다 을 통하여. 이렇게하면 모든 크기의 배열을 전달할 수 있습니다. 일반적으로 C/C++에서 쉽게 알 수있는 방법이 없으므로 배열 크기를 다른 매개 변수 (또는 동일한 폭의 정보를 제공하는 이미지 너비/높이/bpp)로 전달할 수도 있습니다.

+0

Reed에 감사드립니다. 그러나 이제 그 오류가 발생합니다. 잘못된 관리 형/관리되지 않는 형식 조합 (배열 필드는 ByValArray 또는 SafeArray와 쌍을 이루어야 함) IntPtr을 빌드하고 Marshal.StructureToPtr을 작성할 때 생각 ...? – Olewolfe

+0

열거를 확인하십시오. 더 많은 정보가 필요할 것입니다. 나는 당신이 managed -> unmanaged에서 마샬링했다고 가정하고 있었지만, 다른 방법으로 돌아 가면 Marhsal을 IntPtr (바이트 대신 []) 대신 사용하거나 SafeArray를 사용하도록 설정할 수 있습니다. –

+1

불행히도 [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] 이외에는 아무 것도 사용하지 않으면 메모리 주소 지정이 망가집니다. 그래서 기본적으로 구조체 (byte [] 포함)가 IntPtr로 변환되어 DLL로 전달 될 수 있어야합니다. 그리고 byte []의 데이터가 엉망이되고 있습니다. 데이터를 IntPtr에서 byte []로 복사하고 구조체에서 MarshalAs를 설정하지 않으면 모든 것이 변경되었음을 알기 위해 데이터를 확인하여이를 확인했습니다. – Olewolfe