【问题标题】:VBA to COM Exposed .NET assembly - Object doesn't support this property or methodVBA 到 COM 公开的 .NET 程序集 - 对象不支持此属性或方法
【发布时间】:2012-03-01 19:50:45
【问题描述】:

是否可以从 COM 公开的 .NET 程序集访问共享属性?

VBA

Dim appExcel As Object
    Dim objAppSingleton As Object
    Set objAppSingleton = CreateObject("Pitchbook.CommonUtils.Application.PitchbookAppSingleton")
    appExcel = objAppSingleton.CurrentPitchbookExcelApp

VB.NET

<ProgId("Pitchbook.CommonUtils.Application.PitchbookAppSingleton")> _
Public Class PitchbookAppSingleton

    Private Shared _currentPitchbookExcelApplication As PitchbookAppExcel
    Private Shared _syncLockExcel As Object = New Object()

   Public Shared ReadOnly Property CurrentPitchbookExcelApp As PitchbookAppExcel
        Get
            If _currentPitchbookExcelApplication Is Nothing Then
                                    SyncLock [_syncLockExcel]
                    If _currentPitchbookExcelApplication Is Nothing Then
                        Dim currPitchbookExcelApplication As New PitchbookAppExcel()
                        _currentPitchbookExcelApplication = currPitchbookExcelApplication
                    End If
                End SyncLock
            End If
            Return _currentPitchbookExcelApplication
        End Get
    End Property

End Class


Public Class PitchbookAppExcel
    Inherits PitchbookApp

    Protected Friend Sub New()
        MyBase.New()                        
    End Sub

End Class

appExcel = objAppSingleton.CurrentPitchbookExcelApp 行给出了错误: 运行时错误“438”: 对象不支持该属性或方法

【问题讨论】:

  • 你不能从非共享属性声明中访问共享私有对象吗?

标签: vb.net vba com


【解决方案1】:

你需要在VB中说Set来设置一个对象变量。

Set appExcel = objAppSingleton.CurrentPitchbookExcelApp 

如果你不说“Set”,那么 VBA 将寻找默认方法并调用它,以获得非对象类型。如果没有定义默认方法(dispid=0),那么它将失败并出现您遇到的错误。

【讨论】:

  • 感谢您的回复。即使使用 Set appExcel = objAppSingleton.CurrentPitchbookExcelApp,我仍然会遇到同样的错误
  • @ernie99,那我不知道。您是否尝试过在 Visual Studio 调试器中运行 VB 主机并在其中设置断点?
  • 我在 Excel 中使用内置的 Visual Basic IDE。我已经设置了一个断点并单步执行了代码。在本地窗口中查看 objAppSingleton 正确实例化,即它的值不是什么。当您展开对象时,没有列出任何成员。我希望看到列出该对象的成员,但我认为这只是 IDE 的限制(它只显示变量而不是属性)而不是问题。我显然对VBA不太了解。一切似乎都设置正确。我认为这是因为它是共享财产。我会继续挖掘,谢谢。
  • @ernie99,呵呵!我没有注意到这是一个共享财产。你是对的,该属性不应该被共享,只有它在下面使用的私有变量。
  • @ernie99,不是模块,不是。使用公开方法来检索单例的非单例类是解决此问题的完全合理的方法。换句话说:方法必须是实例(非共享)方法才能在 VBA 或脚本的对象上可见,但它们仍然可以只返回一个共享变量来实现单例。基本上,如果您从方法中删除“共享”一词,就我所见,它应该可以工作。
【解决方案2】:

这是一个非常简单的问题,但如果有人还不知道答案,那就是不,您不能从 COM 公开的 .NET 程序集访问共享属性。至少不能直接...但是,如果您创建实例包装器,则可以访问共享属性。

http://www.xtremevbtalk.com/showthread.php?p=1326018
http://support.microsoft.com/Default.aspx?kbid=817248

在我的例子中,我使用 Facade 模式创建了一个专门供 VBA 使用的对象,该对象通过实例公开了相关的共享实用程序功能。感谢大家的cmets。 http://en.wikipedia.org/wiki/Facade_pattern

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多