配列フィールドは ByValArray または SafeArray と組で使用してください。
> SharpFont.dll!SharpFont.PInvokeHelper.PtrToStructure<SharpFont.TrueType.Internal.HeaderRec>(System.IntPtr reference) 行 43 SharpFont.dll!SharpFont.TrueType.Header.Reference.set(System.IntPtr value) 行 205 SharpFont.dll!SharpFont.TrueType.Header.Header(System.IntPtr reference) 行 48 SharpFont.dll!SharpFont.Face.GetSfntTable(SharpFont.TrueType.SfntTag tag) 行 1665 Examples.exe!Examples.ExampleForm.listBoxFont_SelectedIndexChanged(object sender, System.EventArgs e) 行 93 [外部コード]
型 'System.TypeLoadException' のハンドルされていない例外が mscorlib.dll で発生しました 追加情報:型 'SharpFont.TrueType.Internal.HeaderRec' の フィールド 'Created' をマーシャリングできません: 無効なマネージ/アンマネージ型の組み合わせです。 配列フィールドは ByValArray または SafeArray と組で使用してください。
namespace SharpFont.TrueType.Internal { [StructLayout(LayoutKind.Sequential)] internal class HeaderRec { internal FT_Long Table_Version; internal FT_Long Font_Revision; internal FT_Long Checksum_Adjust; internal FT_Long Magic_Number; internal ushort Flags; internal ushort Units_Per_EM; [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)] internal FT_Long[] Created; [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)] internal FT_Long[] Modified; internal short xMin; internal short yMin; internal short xMax; internal short yMax; internal ushort Mac_Style; internal ushort Lowest_Rec_PPEM; internal short Font_Direction; internal short Index_To_Loc_Format; internal short Glyph_Data_Format; } }
応用編
C#側から渡した文字列をC++側で編集して戻したり、バイナリデータをやりとりしたり、構造体や共用体のやりとり等も適当にゴニョゴニョしればできる(ry配列については
[In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)]
みたくしてマーシャラにLPArray指定で配列である旨を知らしめ、さらにArraySubTypeで要素の型を教えてやる。構造体や共用体についてはStructLayout属性とかFieldOffset属性でググればよろし。あとはこれらの組み合わせ。
UnmanagedType.LPArray を指定したら「マーシャリングできません:無効なマネージ/アンマネージ型の組み合わせです。配列フィールドは ByValArray または SafeArray と組で使用してください。」と怒られた。