【问题标题】:Call Win32 DLL from .NET with complex struct使用复杂结构从 .NET 调用 Win32 DLL
【发布时间】:2010-09-23 10:59:26
【问题描述】:

我已将旧的 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 公共 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 

等等

但是,当我运行此代码时,我收到以下错误:

无法封送类型,因为嵌入式数组实例的长度与布局中声明的长度不匹配。

我已经用谷歌搜索和搜索,但我没有想法 - 感谢任何帮助。

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

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

非常感谢 邓肯

【问题讨论】:

    标签: com-interop


    【解决方案1】:

    您的声明似乎混淆了。检查UnmanagedType,也许这可以帮助您找到正确的类型。我会假设 bAddressFlag 在 VB 中应该是 Byte(而不是 char),并且应该使用 UnmanagedType.U1 进行声明。

    这只是猜测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-25
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多