2011-01-31 8 views
0

C#에서 C++ DLL을 사용하려고하며 특정 기능이있는 두 가지 문제가 있습니다.C# 응용 프로그램에서 C++ 라이브러리를 사용할 때 마샬링 오류가 발생했습니다.

기능 C++에서

과 같이 정의됩니다 : C#에서 나는로 정의한

byte* GetEntityUserData(TEntity entity) 

:

object[] o = LE.GetEntityUserData(entity); 
: 나는 다음과 같은 사용을하려고

[DllImport(EngineDll)] 
public static extern object[] GetEntityUserData(TEntity entity); 

다음 오류가 발생합니다.

Cannot marshal 'return value': Invalid managed/unmanaged type combination.

C# 프로그램은 컴파일되지만 런타임 오류가 발생합니다.

+1

C++ 선언을 void *로 변경하면 "여기에 blob of blob이 있습니다. 행운을 빕니다"라고 표시하는 것이 더 정확합니다. 관리 측의 IntPtr, 클래스를 마샬링하여 클래스를 이해할 수 있습니다. 분명히 그것은 배열이 아닙니다. –

답변

3

표현할 데이터가 무엇입니까? object[]이 아니라 byte[]을 반환하도록 C# 서명을 변경했습니다. 관리되지 않는 함수에서 참조 유형을 다시 가져올 수 없습니다. 값 유형 (원시 유형 및 struct)을 의미합니다.

+0

그래, C++쪽에있는 데이터가 무엇인지 더 많이 아는 것이 도움이 될 것입니다. byte *를 돌려 보내는 것의 한가지 문제점은 (char *라고 가정합니다. "byte"는 C++ 측에 정의 된 것과 같습니다) CLR 마샬 러가 마샬링 할 바이트 수를 알지 못하기 때문에 제공 할 필요가 있습니다. (MarshalAsAttribute를 통해) 마샬 러에게 더 많은 정보를 제공하지만 데이터가 실제로 어떻게 될지 또는 호출자가 얼마나 많은 바이트가 바이트에 있는지를 알 수있는 좋은 지침을주기 위해 * –

+0

그래서 원하는 불투명 한 BLOB 나중에 원시 코드로 되돌려 보내겠습니까? 관리 측면에서 사용하지 않습니까? –

+0

@ user441521 : 그것을 사용할 필요가 없다면, 반환 타입을'IntPtr'로 타이핑하고 그것을 잡을 수 있습니다. –

관련 문제