我在C#中有一个数组,必须在VB中初始化。初始化时,我收到一个错误"函数或接口标记为受限,或者函数使用Visual Basic不支持的自动化类型。">
C#.Net代码:
public class InventoryMasterSearchSettings
{
public string[] PrintLabelsIDetail { get; set; }
}
VB.Net代码:
Public Property PrintLabelsIDetail() As String()
Get
PrintLabelsIDetail = mInventoryMasterSearchSettings.PrintLabelsIDetail
End Get
Set(value As String())
mInventoryMasterSearchSettings.PrintLabelsIDetail = value
End Set
End Property
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.PrintLabelsDetail的类型是标准数组吗?(不是集合或数组列表类型(
你可以尝试两件事。
首先-使用编译器指令将数组强制为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侧。字符串类型的平面jane数组通常可以转到COM端,即使没有上面的marshalias编译器指令也是如此。
我会尝试这样或那样的想法,或者事实上,就像我的第二个例子一样,尝试添加封送编译器指令和强制转换。
我的蜘蛛感觉表明,PrintLabelsDetail的数据类型是一个集合、iList或arraylist,而它需要是字符串类型的array((。因此,请检查PrintLabelsDetail的数据类型-我没有测试过,但我认为COM甚至不喜欢用arrayList来代替Array。在通过COM桥发送阵列之前,最好先初始化阵列
编辑
我正在喝咖啡——directcast可能会给你一个COM/ActiveX兼容的数组,但我";思考;它很可能会破坏这种联系。(VB6方面会修改一个副本-它很可能不会在COM对象成员中持久存在(-所以尝试使用编译器指令而不使用directcast建议