文字列の配列へのポインターをマーシャリングするときに問題が発生します。これは、このような無害に見える:文字列の配列へのポインターのマージ
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をリッピングして文字列を1つずつ抽出することができません。
ByValArray ==インプレイス配列、LPArray ==配列へのポインタです。 SizeConstはまだLPArrayで動作するはずですが、マーシャリング時のエラーはちょっと奇妙でした。 –
ああ、パブリックstring [] listOfStrings、それは私が信じている違いを作るByValArrayを持っている場合は、それも動作するはずです。 –