문자열 배열에 대한 포인터를 마샬링하는 데 문제가 있습니다.문자열 배열에 마샬링
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
이 실제로이 같은 다른 구조의 내부에 포함됩니다 : 그것은이 같은 무해한 보이는
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
관리되지 않는 코드를 다시 관리 코드로 호출하고 채워 할당 된 메모리와 가치를 가진를 IntPtr로 Outerstruct 반환 .
관리 세계 :
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
listOfStrings를 단순히 IntPtr로 변경하면 Marshal.PtrToStructure가 작동하지만 이제는 listOfStrings로 추출하여 문자열을 하나씩 추출 할 수 없습니다.
ByValArray == 현재 위치의 배열, LPArray == 배열에 대한 포인터. SizeConst가 여전히 LPArray와 함께 작동해야하기 때문에 마샬링시 오류가 조금 이상합니다. –
오, 그건 당신이 공공 문자열 [] listOfStrings, 내가 믿는 차이를 만드는 ByValArray가있는 경우에도 작동합니다. –