2009-08-25 53 views
1

好了,你到底我錯了在這裏做..的P/Invoke編組站幫助 - 嵌套結構 - 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.SizeOf()做一個Marshal.StructureToPtr()直接作爲一個測試,它給了我一個大小不能計算錯誤。

所有你的P/Invoke忍者,幫我一個答案在這裏,而不是一個請提前「就在C++代碼」 ..

感謝。

+0

感謝您的回覆。事實證明它與結構6中的部分無關。我在其他地方又犯了另一個愚蠢的錯誤。我正在檢查你的建議以及Jared。 – George 2009-08-28 01:23:44

回答

0

請嘗試以下定義。

Partial Public Class NativeConstants 

    '''superfoo_size -> 10 
    Public Const superfoo_size As Integer = 10 

    '''superfoo_len -> 20 
    Public Const superfoo_len As Integer = 20 
End Class 

<System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet:=System.Runtime.InteropServices.CharSet.[Ansi])> _ 
Public Structure Struct6 

    '''short 
    Public Id As Short 

    '''char[200] 
    <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=200)> _ 
    Public aaszSuperfoo As String 

    '''short[20] 
    <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20, ArraySubType:=System.Runtime.InteropServices.UnmanagedType.I2)> _ 
    Public siId() As Short 

    '''short[20] 
    <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20, ArraySubType:=System.Runtime.InteropServices.UnmanagedType.I2)> _ 
    Public siId2() As Short 
End Structure