VB10, автоматически реализованные свойства и COM - PullRequest
2 голосов
/ 01 декабря 2010

Я недавно закончил класс, который мы используем, чтобы связать Access с некоторыми службами WCF.Конечно, это означает, что классы .Net (и все их свойства) должны быть видимы для COM.Учитывая, что я использую VB10, а класс Contact имеет около 20 свойств, я пошел дальше и использовал автоматически реализуемые свойства.

К моему большому удивлению, свойства не были доступны из VBA в Access.Я попытался пометить свойства как ComVisible (что раньше мне не приходилось делать со стандартными свойствами), и все равно это не сработало.После изменения автоматических свойств на стандартные свойства все заработало.

Public Property FirstName As String

Стало

Public Property FirstName As String
    Get
        return _strFirstName
    End Get
    Set
        _strFirstName = value
    End Set
End Property

Насколько я понимаю, оба должны быть эквивалентны.В соответствии с тем, что я прочитал в MSDN, автоматически реализуемые свойства просто позаботятся о том, чтобы создать для вас вспомогательное поле и метод получения / установки, и для всех намерений и целей они должны быть одинаковыми.нет, так что еще происходит за кулисами?

1 Ответ

2 голосов
/ 01 декабря 2010

Они есть. Пример кода:

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.AutoDual)> _
Public Class Class1
    Private prop As Boolean
    Public Property BoolProp() As Boolean
        Get
            Return prop
        End Get
        Set(ByVal value As Boolean)
            prop = value
        End Set
    End Property

    Public Property BoolProp2() As Boolean
End Class

С командами:

tlbexp ClassLibrary1.dll
oleview ClassLibrary2.tlb

Создает этот дамп интерфейса:

interface _Class1 : IDispatch {
    [id(00000000), propget,
      custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)]
    HRESULT ToString([out, retval] BSTR* pRetVal);
    [id(0x60020001)]
    HRESULT Equals(
                    [in] VARIANT obj, 
                    [out, retval] VARIANT_BOOL* pRetVal);
    [id(0x60020002)]
    HRESULT GetHashCode([out, retval] long* pRetVal);
    [id(0x60020003)]
    HRESULT GetType([out, retval] _Type** pRetVal);
    [id(0x60020004), propget]
    HRESULT BoolProp([out, retval] VARIANT_BOOL* pRetVal);
    [id(0x60020004), propput]
    HRESULT BoolProp([in] VARIANT_BOOL pRetVal);
    [id(0x60020006), propget]
    HRESULT BoolProp2([out, retval] VARIANT_BOOL* pRetVal);
    [id(0x60020006), propput]
    HRESULT BoolProp2([in] VARIANT_BOOL pRetVal);
};

Это там. Вы делаете что-то не так, понятия не имеете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...