2009-05-06 4 views
9

C#에서 구조체를 C++ 라이브러리로 전달하려고합니다. 구조체를 객체로 전달하고, C++ 함수는 그것을 포인터 (void *)로 기대합니다.어떻게 구조체를 구조체의 포인터로 마샬링합니까?

구조를 전달하는 데 문제가 있습니다.

" '매개 변수 # 1'을 마샬링 할 수 없습니다 : 여기

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

내가 얻을 런타임 예외 텍스트입니다 잘못된는/(이 값 유형이 구조체와 결합해야 함) 관리되지 않는 유형의 조합을 관리. "

정확히이 컨텍스트에서 LPStruct를 사용하는 MSDN 기사를 발견했지만.

이 내 구조 나 정렬 화에 노력하고 있습니다 :

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

이것은 C++ 기능 :

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

답변

17

는 심판 매개 변수로 구조를 통과하십시오.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

ref를 구조체와 결합하면 개념적으로 주소가 전달됩니다.

+4

이 경우에는 [마샬 러스]가 필요하지 않습니다. –

+0

@Anton, 정확함 (업데이트 됨) – JaredPar

+0

최종 작업 결과 : public static extern IntPtr TheFunction ([MarshalAs (UnmanagedType.Struct), In] ref UserRec userRec); 그리고 여기서 [MurshalAs]는 명시 적으로 지정하는 것이지만 필수는 아닙니다. –

13

덧붙여 말하자면, UnmanagedType.LPStruct은 정확한 경우 MarshalAs 인수입니다. 간접 추가 수준의 관리되지 않는 GUID로 System.Guid 값 유형을 치료 :

UnmanagedType.LPStruct는 하나의 특정 사건에 대한 지원 : 마이크로 소프트 직원입니다 A quote from Adam Nathan.

+0

하지만 PROPERTYKEY에서 작동하고 싶었습니다 : '( – jnm2

+0

Btw, 이것이 왜 그렇게되는지 설명해 주셔서 감사합니다. 그게 내가 정말로 원했던 것입니다. – jnm2

+0

(잠깐,이 광기는 무엇입니까? C# 언어에는 COM 인터페이스에 대한 예외가 있어야합니다.) – jnm2

관련 문제