2013-08-07 4 views
3

나는 C#을 함께 일하고 있어요하는 I 제 3 자 dll정렬 화하는 방법 Int 인 배열 또는 포인터로 Int 인 배열

(I이 중복 될 수 있지만 다른 스레드를 이해하지 못하는 이해) 그 int 배열 (또는 int 배열에 대한 포인터)가 매개 변수로 필요합니다. C#과 C/C++ 사이의 int 배열을 어떻게 마샬링합니까? 함수는 다음과 같이 선언됩니다.

// reads/writes int values from/into the array 
__declspec(dllimport) void __stdcall ReadStuff(int id, int* buffer); 

C int*은 포인터일까요? 따라서 IntPtr을 사용해야하거나, int[] (선호)을 사용할 수 있다면 혼란 스럽습니다. 나는이 확인 될 줄 알았는데 :

[DllImport(dllName)] 
static extern void ReadStuff(int id, [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] ref int[] buffer); 

// call 
int[] array = new int[12]; 
ReadStuff(1, ref array); 

것이라고 작업을? 아니면 C#에서이 함수를 안전한 코드로 선언해야합니까? 그것은 SafeArray는하지 (하지 테스트)

extern "C" __declspec(dllexport) VOID WINAPI ReadStuff(int id, int* buffer, int length); 

답변

4

:

[DllImport(dllName)] 
static extern void ReadStuff(int id, IntPtr buffer, int length); 


int[] array = new int[12]; 

unsafe 
{ 
    fixed (int* data = &array[0]) 
    ReadStuff(1, data, array.Length); 
} 

C++ 코드 :

+0

+1이 필요하다고 생각합니다. – dtb

0

은 당신이 뭔가를 할 수 있습니다. SafeArray는 Variants와 OLE의 좋은 옛날에 연결되어 있습니다 :-) 아마도 "dodo"라는 단어 근처의 사전에 있습니다.

때문이다 :

[DllImport(dllName, CallingConvention=CallingConvention.StdCall)] 
static extern void ReadStuff(int id, int[] buffer); 

마샬은 "오른쪽"일을 할 것입니다.

또는

[DllImport(dllName, CallingConvention=CallingConvention.StdCall)] 
static extern void ReadStuff(int id, IntPtr buffer); 

하지만 그것은 사용하는 것이 더 복잡하다.

CallingConvention=CallingConvention.StdCall이 기본값이므로 명시 적으로 작성할 필요는 없습니다.

// call 
int[] array = new int[12]; 
ReadStuff(1, array); 

ref int[]int** (하지만 일반적으로 어레이를 수신하기 때문에, :-) 배열을 전송하지, 통과 복잡 할 수있다)

것 :

당신은이 방법을 사용 귀하의 "인터페이스"는 매우 가난합니다 : 당신은 버퍼의 길이를 ReadStuff으로 알 수 없으며, 버퍼의 필요한 길이를받을 수 없으며 실제로 사용 된 버퍼의 문자 수를받을 수 없습니다.

+0

'int * data = & array [0]'은'int * data = array'로 단축 될 수 있습니다. (C/C++ 에서처럼) – xanatos

+0

안전하지 않은 코드를 사용하는 것을 피합니다. 나는 그것을 사용한 적이 없으며 왜 시작해야하는지 알지 못합니다. 또한 내가 말했듯이 제 3 자 DLL입니다. 함수의 서명을 변경할 수 없습니다. – Bitterblue

+0

당신이 관리되지 않는 버퍼/포인터를 전달하려는 경우, 당신은'static extern void ReadStuff (int id, int [] buffer);에 대해 안전하지 않거나 고정 된 –