2010-09-23 33 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声明为例。

这只是一个猜测。