我已将旧的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配对)。“
非常感谢 邓肯