のねのBlog

パソコンやソフト開発で起きた問題など書きます。よろしくお願いします。

配列フィールドは 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 と組で使用してください。」と怒られた。