我最近完成了一个我们用来将Access绑定到某些WCF服务的类。当然,这意味着.Net类(及其所有属性)需要对COM可见。鉴于我使用VB10并且Contact类有大约20个属性,我继续使用自动实现属性。
令我惊讶的是,无法从Access中的VBA内访问这些属性。我尝试将属性标记为ComVisible(我过去不需要使用标准属性),但它仍然无效。将自动属性更改为标准属性后,一切正常。
Public Property FirstName As String
成了
Public Property FirstName As String
Get
return _strFirstName
End Get
Set
_strFirstName = value
End Set
End Property
我的理解是两者应该是等价的。根据我在MSDN上阅读的内容,自动实现属性只需为您创建支持字段和getter / setter,并且无论如何都应该是相同的。
显然他们不是,那么幕后还有什么呢?
答案 0 :(得分:2)
他们是。一些示例代码:
<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);
};
就在那里。你做错了什么,不知道是什么。