2011-09-19 6 views
0

관리되지 않는 DLL 라이브러리와 함께 관리되는 프로그램이 있습니다.관리되는 코드에서 관리되지 않는 배열 채우기

라이브러리는 관리되는 호스트가 관리되지 않는 배열을 채우도록 (위임으로 변환 된 콜백 함수로) 요청하는 객체를 생성합니다. 배열 자체는 크기에 대한 정보와 함께 포인터 (IntPtr)를 통해 전달됩니다. 이 유형은 양측에 알려져 있습니다. 핵심은 관리되는 코드에서 데이터로 관리되지 않는 배열을 안전하게 채우는 방법입니다. 두 가지 제한이 적용됩니다. 안전하지 않은 코드가 없으며 추가 배열을 생성하지 않는 것이 좋습니다. 배열은 다른 방법으로 전달 될 수 있습니다.

콜백은 다음과 같은 프로토 타입 보자 : 당신이 다음 안전하지 않은 코드를하지 않으

protected delegate void FillData(IntPtr array, int count); 
+1

콜백 서명을 공유 할 수 있습니까? –

+0

요청에 따라 콜백 서명이 추가되었습니다. – Spook

+0

PInvoke에 해당하는 항목은 무엇입니까? 당신이 사용하고 있다고? –

답변

2

당신이 PInvoke를 마샬을 수 있도록해야합니다 :

typedef void (__stdcall * FillData)(double * array, int count); 

이 위임하자를 다음과 같은 프로토 타입을 가지고 배열을 복사하십시오. 위임 형식을 다음과 같이 선언하십시오.

private delegate MyUnmanagedCallback(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] array, 
    int count); 

가비지 수집 할 수 없도록 대리인 개체를 저장하십시오.

0

FillData 프로토 타입에 따라 관리되는 콜백을 작성합니다. Marshal.GetFunctionPointerForDelegate 메서드를 사용하여 관리되지 않는 함수 포인터를 만듭니다. 콜백 함수 포인터로 비 관리 코드에 전달하십시오.

+0

나는 그렇게하고있다. 문제는 관리되지 않는 코드의 배열을 관리되는 코드로 전달하여 관리되는 코드로 데이터를 채울 수있는 방법이었습니다. – Spook

관련 문제