2010-01-30 3 views
0

동일한 유형의 구조체 포인터 void ** 목록을 반환하는 DLL을 p-invoking하고 있습니다. From what I've read, 그 목록에서 내 구조를 캐스팅하고 가져 오려면 구조가 관리되지 않는 것으로 간주되어야합니다. 구조체의 주요 범인은 내가 이상 마샬링하는 데 노력하고있어 C 측에서 다음 두 개의 필드가 있습니다"unmanaged"상태로 유지하면서 구조체를 마샬링

char name[1024]; 
int crop[4]; 

대부분의 가이드가 문자열을 사용하거나 관리 측면에서 해당 구조체에 [] int로 제안,하지만 그 이러한 필드가 있으면 관리되는 구조로되어 무효화 목록에서 추출 할 수 없습니다.

관리되지 않는 구조체를 제공하는 이러한 필드를 마샬링 할 수있는 다른 방법은 무엇입니까?

답변

1

구조는 도움없이 마샬링합니다 또는 당신이 이런 식으로 선언하면 안전하지 않은 키워드에 필요한 :

using System.Runtime.InteropServices; 
... 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct Example { 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] 
    public string name; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
    int[] crop; 
    } 

가 Marshal.PtrToStructure와 구조에 보이드 * 변환) (.

+0

구조체를 좀 더 친근하게 만들 때 유용 합니다만, 목록에있는 모든 구조체에 액세스하려면 안전하지 않은 코드가 필요했습니다. – RandomEngy

+0

Marshal.ReadIntPtr()이 void 인 경우 반드시 덮어 줘야합니다. 귀하의 게시물에 목록이 어떻게 구현되었는지 알려주는 세부 정보가 충분하지 않습니다. 링크 된 목록과 포인터의 배열. –

+0

아, 맞습니다. – RandomEngy

1

당신은 데이터 구조는 고정 된 크기 어레이 버퍼를 생성 할 fixed 키워드를 사용할 수

unsafe struct Foo 
{ 
    public fixed byte name[1024]; 
    public fixed int crop[4]; 
} 

static unsafe void DumpCrops(void** ptr, int count) 
{ 
    Foo** p = (Foo**)ptr; 

    for (int i = 0; i < count; i++) 
    { 
     Foo* f = p[i]; 

     for (int j = 0; j < 4; j++) 
     { 
      Console.WriteLine(f->crop[j]); 
     } 
    } 
} 
넌 같이 구조체에 그 시점에서 회선을 추가해야
+0

감사합니다. – RandomEngy

0

...

 

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public unsafe struct _FOOBAR { 
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 1024, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I2)] 
char name[1024]; 
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I4)] 
int crop[4]; 
}; 
, 안부를하는 데 도움이 당신은 속성 비트, UnmanagedType의 마지막 비트를 재확인 할 필요가

...

희망,,Tom.