【发布时间】: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