使用复杂的结构从.NET调用Win32 DLL

时间:2010-09-23 10:59:27

标签: com-interop

我已将旧的VB6组件升级到.NET。该组件调用另一个Win32组件,具有以下类型结构:

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

我无法引用此Win32 DLL,因为它不是COM DLL,因此.NET无法自动为我创建任何互操作。

我有Win32 DLL的原始源代码(用C编写),结构在这里定义为:

typedef struct tagDDPARAMS
    {

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

    BYTE sPremiseThreshold[3];    

etc.

当我升级VB6组件时,为结构生成的.NET代码是:

公共结构DDPARAMS          Public bAddressFlag()As 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搜索并用Google搜索,但我没有任何帮助。

更新:我尝试了下面的建议并将ByValArray更改为AnsiBStr(一个字节字符串),现在得到以下内容:

“无法封送'DDRECORD'类型的字段'ofTown':无效的托管/非托管类型组合(数组字段必须与ByValArray或SafeArray配对)。” < / p>

非常感谢 邓肯

1 个答案:

答案 0 :(得分:0)

您的声明似乎已经混淆了。检查UnmanagedType,这可能有助于您找到合适的类型。我假设bAddressFlag应该是VB中的Byte(而不是char),并且应该使用UnmanagedType.U1声明。

这只是猜测。