1
[OK]を、私はここで間違って一体何をしています。..P /呼び出しマーシャリングヘルプ - ネストされた構造 - VB.NET
「System.TypeLoadException:できませんマーシャル・フィールド 『S2』タイプの 『MY_Struct1』:タイプこのフィールドの定義にはレイアウト情報がありますが、無効な管理対象/非管理対象型の組み合わせがあるか、または非マーシャル可能です。
'VENDORAPI short FunctionEx(Struct1* pstruct1);
Declare Auto Function FunctionEx Lib "VENDORDLL.dll" (<MarshalAs(UnmanagedType.Struct)> ByRef pstruct1 As MY_Struct1) As Int16
Enum MY_ANEnum
a
b
c
End Enum
Enum MY_ANEnum2
x
y
z
End Enum
Const foo_size = 5
Const foo1_size = 15
Const foo2_size = 25
Const foo3_size = 35
Const superfoo_size = 10
Const superfoo_len = 20
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct1
'typedef struct
'{
'short Id;
'ANEnum aEnum;
'Struct2 s2;
'} Struct1;
<MarshalAs(UnmanagedType.I2)> Public Id As Int16
<MarshalAs(UnmanagedType.I2)> Public aEnum As MY_ANEnum
<MarshalAs(UnmanagedType.Struct)> Public s2 As MY_Struct2
End Structure
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct2
'struct Struct2
'{
'Struct3 s3;
'Struct4 s4;
'Struct5 s5;
'Struct6 s6;
'};
Public s3 As MY_Struct3
Public s4 As MY_Struct4
Public s5 As MY_Struct5
Public s6 As MY_Struct6
End Structure
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct3
'struct Struct3
'{
' short Flag;
' long Id;
' ANEnum2 aEnum2;
' char foo[foo_size];
'};
<MarshalAs(UnmanagedType.I2)> Public Flag As Int16
<MarshalAs(UnmanagedType.I4)> Public Id As Int32
<MarshalAs(UnmanagedType.I2)> Public enum2 As MY_ANEnum2
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo_size)> Public foo As String
End Structure
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct4
'struct Struct4
'{
'char foo1[foo1_size];
'char foo2[foo2_size];
'};
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo1_size)> Public foo1 As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo2_size)> Public foo2 As String
End Structure
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct5
'typedef struct
'{
'char szfoo31[foo3_size];
'char szfoo32[foo3_size];
'char szfoo33[foo3_size];
'char szfoo34[foo3_size];
'} Struct5;
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo3_size)> Public szfoo31 As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo3_size)> Public szfoo32 As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo3_size)> Public szfoo33 As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=foo3_size)> Public szfoo34 As String
End Structure
<StructLayout(LayoutKind.Sequential)> _
Structure MY_Struct6
'struct Struct6
'{
'short Id;
'char aaszSuperfoo[superfoo_len][superfoo_size];
'short siId[superfoo_len];
'short siId2[superfoo_len];
'};
<MarshalAs(UnmanagedType.I2)> Public Id As Int16
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=superfoo_len)> Public aaszSuperFoo() As String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.I2, SizeConst:=superfoo_len)> Public siId() As Int16
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.I2, SizeConst:=superfoo_len)> Public siId2() As Int16
End Structure
ここでは、MY_Struct6の多次元配列と関連があると推測しています。
私はMarshal.StructureToPtr()をテストとして直接行うために単純なビルドとMarshal.SizeOf()を試しました。サイズが計算できないというエラーが出ます。
すべておP/.. 1事前に
感謝をしてください「だけC++でそれをコーディング」、忍者を起動し、ここでの回答で私をフックアップ、そしてません。
お返事ありがとうございます。構造体6のセクションとは何の関係もないことが判明しました。私は他のどこかで愚かな間違いを犯していました。私はあなたの提案をJaredにもチェックしています。 – George