繁体   English   中英

错误 Function 或接口标记为受限,或者 function 在 VB6 中使用 Visual Basic 中不支持的自动化类型

[英]Error Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic in VB6

我在 C# 中有一个数组,它必须在 VB 中初始化。 初始化时出现错误“函数或接口标记为受限,或 function 使用 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.PrintLabelsIDetail 的类型是标准数组吗? (不是集合,也不是 arraylist 类型)

你可以尝试两件事。

首先 - 使用编译器指令将数组强制为 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

因此,从消费的角度来看,上面可能有助于将字符串数组()编组为与 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 侧。 字符串类型的平面简数组通常可以从 go 到 COM 端,即使没有上述 marshalas 编译器指令。

我会尝试一个或另一个想法,或者实际上就像我的第二个示例一样,尝试添加一个编组编译器指令和一个强制转换。

我的蜘蛛感觉表明,当 PrintLabelsIDetail 的数据类型需要是字符串类型的 array() 时,它是一个集合、iList 或 arrarylist。 所以,检查 PrintLabelsIDetail 的数据类型——我没有测试过,但我认为 COM 甚至不会喜欢 arrayList 来代替 Array。 你最好在通过 COM 桥发送之前初始化数组

编辑

我正在喝咖啡——直接广播可能会给你一个兼容 COM/ActiveX 的数组,但我“认为”它很可能会中断连接。 (VB6 方面将修改副本 - 它很可能不会保留在 COM object 成员中) - 所以在没有直接广播建议的情况下尝试编译器指令

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM