Программа VB6 не видит свойства для VB.Net COM DLL - PullRequest
0 голосов
/ 04 мая 2018

Мой клиент имеет программу VB6, установленную на большом количестве компьютеров по всему миру. Теперь необходимо получить доступ к внешней системе через REST API. Я создал библиотеку классов в VB.Net, ориентированную на .NET Framework 4. (Это самая последняя версия, установленная повсеместно.) DLL предоставляет около десятка открытых функций и подпрограмм и ~ 40 свойств. Я протестировал DLL с помощью этого кода PowerShell:

[System.Reflection.Assembly]::LoadFile( "$directorypath\Debug\MyExample.dll")
$quotaInstance = new-object MyExample.ComClass1

Все методы и свойства доступны из сценария PS. Однако когда я загружаю DLL в IDE VB6, браузер объектов показывает только методы, а не свойства. Если я не могу понять это, мне придется перекодировать их как набор функций и подпрограмм. Я ненавижу эту идею.

Вопрос Как сделать свойства видимыми для COM в .NET DLL (методы ДОЛЖНЫ работать) выглядит аналогично, но я не (явно ниже) использую интерфейс, и я не уверен, что на этот вопрос когда-либо был дан ответ

Кто-нибудь знает, что происходит, и (что более важно), как это исправить? Спасибо!

Обновление: люди просили посмотреть мой код, так что здесь приведен упрощенный пример. Я полагаю из InterfaceId, что Visual Studio Community 2017 создает какой-то интерфейс для меня.

<ComClass(Example.ClassId, Example.InterfaceId, Example.EventsId)>
Public Class Example

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "099bfc91-1f82-4a26-b1e0-d9645bb1714d"
    Public Const InterfaceId As String = "13e9763d-455c-4d89-8323-cc4e7ae7648e"
    Public Const EventsId As String = "773feeba-e635-4411-b175-30b345afa841"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

    ' *** Auto-implemented properties
    ' When you declare an auto-implemented property, Visual Basic automatically
    ' creates a hidden Private field called the backing field to contain the
    ' Property value. The backing field name is the auto-implemented Property
    ' name preceded by an underscore (_).

    Public Property Foo As String
    Public Property Bar As Integer

    Public Function InitiateSession(ExampleServer As String) As Boolean
        ' Creates a new API_session.
        ' Returns True if the connection was successful, otherwise False
        ' ...
    End Function

    Public Sub CloseSession()
        ' Releases the current API_session.
        ' ...
    End Sub
End Class

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Если ваши свойства имеют общий тип, такой как List<T>, они не могут быть экспортированы в COM.

Если это так, вы должны увидеть некоторые предупреждения о сборке от компилятора .NET, указывающие на это.

(Вопрос не показывает пример, поэтому я не знаю, так ли это здесь).

0 голосов
/ 21 мая 2018

По неизвестной причине автоматическая генерация интерфейса, предоставляемая компилятором VB для классов, помеченных ComClassAttribute , игнорирует автоматически внедряемые свойства. Вам необходимо явно указать длинную форму для свойств.

Таким образом, вместо автоматически реализованной формы:

Public Property Foo As String

Вам нужно:

Private _Foo As String
Public Property Foo As String
    Get
        Return _Foo
    End Get
    Set(value As String)
        _Foo = value
    End Set
End Property

для включения Foo в интерфейс COM.

0 голосов
/ 04 мая 2018

Я не большой поклонник VB, но надеюсь, что приведенный ниже пример помогает

Public Class Class1
    Implements IClass1

    Property Property_1 As Int32 Implements IClass1.Property_1
        Get
            Return Property_1
        End Get
        Set(value As Int32)
            Property_1 = value
        End Set
    End Property
End Class

Public Interface IClass1
    Property Property_1 As Int32
End Interface
...