错误 功能或接口被标记为受限,或者功能使用了VB6中Visual Basic不支持的自动化类型。

问题描述 投票:0回答:1

我有一个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
c# .net vb.net vb6
1个回答
1
投票

你确定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的建议。

© www.soinside.com 2019 - 2024. All rights reserved.