簡體   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