2009-08-24 4 views
0

관리 코드에서 단락 배열에 대한 포인터를 포함하는 구조를 나타내는 방식에 문제가 있습니다. 해당 필드가 짧은 값의 배열에 대한 포인터는 단순히 때문에 비록 간접적 인 추가 레벨이되도록 하였다 -형식의 배열에 대한 마샬링 (관리되는 C# -> 관리되지 않는 C++)

' shortValues'에 대한 메모리가 관리되지 않는 코드 내부에 할당
typedef struct 
{ 
    short size; 
    unsigned short** shortValues; 
} UnmanagedStruct; 

: 구조체는 다음과 같습니다 할당 된 메모리는 호출자 (관리 코드)에서도 볼 수 있습니다. 'size'필드는 배열의 요소 수를 나타냅니다. 관리 코드에서이를 어떻게 표현합니까?

난 그냥 IntPtr에 전달할 것이라고 생각한 다음 관리되지 않는 호출이 반환되면 값에 액세스하는 방법을 파악할 수 없습니다.

답변

0

안전하지 않은 코드는 괜찮습니까?

public unsafe struct UnmanagedStruct 
{ 
    public short size; 
    public ushort** shortValues; 
} 

[DllImport("example.dll")] 
public static extern void GetUnmanagedStruct(out UnmanagedStruct s); 

당신은 ushort의 배열에 대한 포인터가있는 경우 :

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     for (ushort* p = s.shortValues[i]; p != null; p++) 
     { 
      ushort x = *p; 
      Console.WriteLine(x); 
     } 
    } 
} 
+0

그 코드는 내게 정확하게 맞습니다. 감사합니다 dtb! 내가주의를 기울이는 동안 다른 질문 하나만해도 될까요? 다른 스레드에 게시했습니다 : http://stackoverflow.com/questions/1323797/marshaling-pointer-to-an-array-of-strings – Dilip

+0

질문 : 답변을 게시하는 것보다 질문을 업데이트하는 것이 좋습니다. 새로운 세부 사항에 대한 질문. 또한, 답변으로 문제가 해결되면 그것을 수락하는 것을 잊지 마십시오! :) – dtb

+0

@dtb : 나는 여기서 눈이 멀어야 만하지만 어떻게 대답을 "수락"합니까? – Dilip

0

죄송 사람 : 당신이 ushort의의 null로 끝나는 배열의 배열이있는 경우

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     ushort x = (*s.shortValues)[i]; 
     Console.WriteLine(x); 
    } 
} 

합니다. 문제 설명이 잘못되었습니다. 모양은 다음과 같습니다.

unsigned short ** shortValues;

은 shorts에 대한 포인터의 배열에 대한 포인터입니다. 그래서 각 요소 자체가 내가이 일을 생각할 수있는 짧은 *

유일한 방법입니다 :

공용 클래스 UnmanagedStruct { 공공 INT의 크기; 공개 IntPtr shortValues; } 관리되지 않는 코드에서 호출이 반환 후

:

을 IntPtr [] listOfShorts = 새 IntPtr입니다 [크기] Marshal.Copy (shortValues, listOfShorts, 0, size);

listOfShorts의 각 IntPtr이 이제는 []를 가리 킵니다. 하지만 이제 문제는 각 개별 배열의 크기를 알 수 없기 때문에 추출 할 수 없다는 것입니다.

어딘가에 중요한 정보가 빠져 있어야합니다.