我已將舊的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配對)。「
非常感謝 鄧肯