我有一个C#中的数组,必须在VB中初始化。当初始化时,我得到一个错误 "函数或接口被标记为受限,或者函数使用的自动化类型在Visual Basic中不支持。"
C#.Net代码 :
public class InventoryMasterSearchSettings
{
public string[] PrintLabelsIDetail { get; set; }
}
VB.Net代码:VB6。
Public Property PrintLabelsIDetail() As String()
Get
PrintLabelsIDetail = mInventoryMasterSearchSettings.PrintLabelsIDetail
End Get
Set(value As String())
mInventoryMasterSearchSettings.PrintLabelsIDetail = value
End Set
End Property
VB6.Net代码:VB.Net代码:VB6
Public Sub ShowPrintLabels(invmast() As String, bShowAvailableInventoryOnlyPar As Boolean, Optional fCalledFromScreen As Form, Optional sVendorIDPar As String, Optional sUPCCodePar As String, Optional sInventoryDescriptionPar As String)
Dim oInventoryMasterSearchSettings As New Shared_Interop.InventoryMasterSearchSettings
oInventoryMasterSearchSettings.PrintLabelsIDetail = invmast 'error on PrintLabelsIDetail
End Sub
你确定mInventoryMasterSearchSettings.PrintLabelsIDetail的类型是一个标准数组吗?(不是一个集合,或者一个数组列表类型)
你可以尝试两件事。
首先--使用编译器指令强制将数组作为COM "安全 "数组。
Public Property PrintLabelsIDetail() As <MarshalAs(UnmanagedType.SafeArray)> String()
Get
PrintLabelsIDetail = mInventoryMasterSearchSettings.PrintLabelsIDetail
End Get
Set(value As String())
mInventoryMasterSearchSettings.PrintLabelsIDetail = value
End Set
End Property
所以,上面可能很好地帮助将字符串的array()从消耗的角度调剂成更能与COM端兼容的东西。
另一个想法?你可以在返回类型之前对其进行一个转码。
所以,比如说像这样。
Public Property PrintLabelsIDetail() As <MarshalAs(UnmanagedType.SafeArray)> String()
Get
PrintLabelsIDetail = DirectCast(mInventoryMasterSearchSettings.PrintLabelsIDetail, String())
End Get
Set(value As String())
mInventoryMasterSearchSettings.PrintLabelsIDetail = value
End Set
End Property
另外,如果string()类型的数组没有被初始化,那么你可能要确保在返回数组之前已经发生了。
一般来说,你可以从 COM 端向 .net 传递一个数组,但是你必须以 byref 而不是 byval 的方式发送这个数组。
然而,你却反其道而行之。.net --> COM 端。一个字符串类型的平面简数组通常可以送到COM端,即使如此,也不需要上面的marshalas编译器指令。
我会尝试一个或另一个想法,或者事实上像我的第2个例子一样,尝试同时添加marshalas编译器指令,和cast。
我的蜘蛛感觉表明PrintLabelsIDetail的数据类型是一个集合、iList或arrarylist,而它需要是一个字符串类型的array()。所以,检查PrintLabelsIDetail的数据类型--我没有测试过,但我认为COM甚至不会喜欢用arrayList代替Array。而且你最好在通过COM桥发送数组之前先初始化它。
我正在喝咖啡--直接广播可能会得到一个COMActiveX兼容的数组,但我 "认为 "它很可能会破坏连接。(VB6这边会修改一个副本--它很可能不会在COM对象成员中持久存在) - 所以试试编译器指令而不是directcast的建议。