2010-09-23 35 views
0

我已將舊的VB6組件升級到.NET。這個組件到其它的Win32組件的調用,具有以下類型的結構:從複雜的結構中調用.NET的Win32 DLL

Public Type DDPARAMS 
    bAddressFlag As String * 1     
    bCompanyFlag As String * 1     
    bNameFlag As String * 1      
    bPremiseFlag As String * 1  
..etc 

我不能引用這個DLL的Win32,因爲它不是一個COM DLL,所以.NET不能自動爲我創造的任何互操作。

我有用於Win32 DLL(寫入C)的原始源,並且該結構在這裏定義爲:

typedef struct tagDDPARAMS 
    { 

    BYTE bAddressFlag;    
    BYTE bCompanyFlag;    
    BYTE bNameFlag;     
    BYTE bPremiseFlag;    

    BYTE sPremiseThreshold[3];  

etc. 

當我升級VB6部件,該結構產生的.NET代碼是:

公共結構DDPARAMS 公共bAddressFlag()爲char

<VBFixedString(1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=1)> Public bCompanyFlag() As Char 

    <VBFixedString(1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=1)> Public bNameFlag() As Char 

    <VBFixedString(1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=1)> Public bPremiseFlag() As Char 

    <VBFixedString(3), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=3)> Public sPremiseThreshold() As Char 

    <VBFixedString(3), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=3)> Public sLooseThreshold() As Char 

然而,當我運行此代碼,我得到以下錯誤:

類型不能被封是因爲嵌入數組實例的長度不符合佈局聲明的長度。

我已經Google和谷歌搜索和出來的想法 - 任何幫助表示讚賞。

更新:我試過下面的建議,改變了ByValArray到AnsiBStr(一個字節的字符串),現在得到如下:

「無法元帥場‘sTown’類型的‘DDRECORD’:無效的託管/非託管類型組合(數組字段必須與ByValArray或SafeArray配對)。「

非常感謝 鄧肯

回答

0

看來你的聲明混淆。檢查UnmanagedType,也許這有助於您找到適當的類型。我假設bAddressFlag應該是VB中的字節(而不是char),應該以UnmanagedType.U1聲明爲例。

這只是一個猜測。