Как включить раннее связывание переменной объекта VBA с классами COM, созданными в .NET - PullRequest
2 голосов
/ 17 февраля 2012

У меня, похоже, возникают проблемы с тем, чтобы моя библиотека классов COM (на основе .NET) поддерживала раннее связывание.

Я создаю библиотеку классов в VB.NET 2003 для использования в Office 2003 VBA (ипозже для Office 2010).Документация @ StackOverflow и других источников привела меня к следующему фрагменту кода:

    Imports System.Runtime.InteropServices

    <InterfaceType(ComInterfaceType.InterfaceIsDual), _
    ComVisible(True), _
    Guid("<some valid GUID>")> _
    Public Interface _TestCOMClass
        Function Test() As String
    End Interface

    <ClassInterface(ClassInterfaceType.None), _
    ComVisible(True), _
    Guid("<another valid GUID>"), _
    ProgId("TestCOMDLL.TestCOMClass")> _
    Public Class TestCOMClass
        Implements _TestCOMClass
        Public Function Test() As String Implements _TestCOMClass.Test
            Return "Test value"
       End Function
    End Class

Решение установлено для компиляции с COM Interop.Он успешно создается, и затем ProgID появляется в списке «Ссылки» в VBA.

Я использую это в VBA, устанавливая соответствующую ссылку, а затем объявляя переменные соответствующего типа и создавая экземпляр моего класса.Вот где это становится загадочным.

    Dim EarlyBird As TestCOMDLL.TestCOMClass
    Dim LateBird  As Object

    Set EarlyBird = New TestCOMDLL.TestCOMClass
    ' This is my preferred instantiation method, but results in a 
    ' "Does not support Automation or expected interface" error

    Set EarlyBird = CreateObject("TestCOMDLL.TestCOMClass")
    ' This is my 2nd best instantiation method, 
    ' but results in a Type Mismatch error

    Set LateBird = CreateObject("TestCOMDLL.TestCOMClass")
    MsgBox LateBird.Test
    ' This works, but has all the disadvantages of late binding

Таким образом, я могу ссылаться на мою библиотеку, объявлять переменные объекта соответствующего типа и создавать экземпляры моего класса, но я не могу назначить ссылку на экземпляр объекта для моей типизированной переменной, тольков переменную типа Object.Кроме того, создание экземпляра ключевого слова New, как представляется, поддерживается (Intellisense предлагает библиотеку и класс в качестве параметров), но происходит сбой во время выполнения.

Чего не хватает в моем коде VB.NET или настройках сборки, что препятствует работе раннего связывания?

PS: Еще один способ решения моей проблемы состоит в том, что я попробовал решение в этом потоке StackOverflow и обнаружил, что то, что говорит AnthonyWJones

Вы можететакже ссылаться на dll и использовать раннее связывание:

не верно в моем случае ...: - (

...