我已将旧的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>
非常感谢 邓肯
答案 0 :(得分:0)
您的声明似乎已经混淆了。检查UnmanagedType,这可能有助于您找到合适的类型。我假设bAddressFlag应该是VB中的Byte(而不是char),并且应该使用UnmanagedType.U1声明。
这只是猜测。