【问题标题】:VB10, Auto-Implemented Properties and COMVB10,自动实现的属性和 COM
【发布时间】:2011-05-18 04:14:12
【问题描述】:

我最近完成了一个课程,我们用它来将 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,并且对于所有意图和目的,它们应该是相同的。

显然他们不是,那么幕后还有什么?

【问题讨论】:

  • 供参考(因为我花了 5 分钟才找到),这里是关于自动属性的 MSDN 文章:msdn.microsoft.com/en-us/library/dd293589.aspx
  • 我真的很讨厌人们这样做。我什至在我的帖子中提到我已经阅读了 MSDN 上的文章。那篇文章就是我问这个问题的原因。我非常清楚应该有零差异的事实;但是,我不希望在实际的现实世界中看到这种情况。
  • 我知道。我发布了链接,以便 其他人 可以参考它。我想我可以在您帖子的链接中进行编辑。很抱歉造成误解。

标签: vb.net com interop properties


【解决方案1】:

他们是。一些示例代码:

<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);
};

它就在那里。你做错了什么,不知道是什么。

【讨论】:

  • 可能是我缺少您使用的命令:“tlbexp ClassLibrary1.dll”和“oleview ClassLibrary2.tlb”。如果我使用您在上面发布的确切代码(复制和粘贴)并在构建设置中选择“Register for COM interop”,则 BoolProp2 在 Access 中不可见。
  • 使用 Regasm.exe /u 取消注册程序集并验证它是否从 Access 中消失。确保您没有选择旧版本。
  • 好的,我会这样做的。我知道两者之间不应该有任何区别,接口转储似乎证实了这一点。我会接受这个作为答案,并假设我在其他地方搞砸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多