Ошибка Функция или интерфейс помечены как ограниченные, либо функция использует тип автоматизации, не поддерживаемый в Visual Basi c в VB6 - PullRequest
0 голосов
/ 02 мая 2020

У меня есть массив в C#, который должен быть инициализирован в VB. При инициализации появляется ошибка «Функция или интерфейс помечены как ограниченные, либо функция использует тип автоматизации, не поддерживаемый в Visual Basi c.» *

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

1 Ответ

1 голос
/ 03 мая 2020

Вы уверены, что тип 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. Массив плоскости jane типа string обычно может go на стороне COM, и даже без директивы компилятора marshalas, приведенной выше.

Я бы попробовал ту или иную идею, или фактически, как это делает мой второй пример, попробуйте добавить и директиву компилятора маршала, и приведение.

Мой паук подсказывает, что тип данных PrintLabelsIDetail является коллекцией, iList или arrarylist, когда он должен быть array () строкового типа. Итак, проверьте тип данных PrintLabelsIDetail - я не проверял, но я не думаю, что COM будет даже нравиться arrayList вместо Array. И вам было бы неплохо инициализировать массив перед его отправкой по COM-мосту

Edit

У меня был кофе - прямая трансляция может получить вам COM / ActiveX-совместимый массив, но я " думаю, что это вполне может разорвать связь. (сторона VB6 будет изменять копию - она ​​может не сохраняться в элементах COM-объекта) - поэтому попробуйте директиву компилятора без указания прямой трансляции

...