Как включить раннюю привязку объектной переменной VBA к классам COM, созданным в .NET

Кажется, у меня проблемы с получением моей библиотеки классов 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-взаимодействия. Он успешно строится, и затем 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 и использовать раннее связывание:

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


person FMK    schedule 17.02.2012    source источник
comment
Это может пойти не так, только если вы добавили направляющие позже и забыли повторно зарегистрировать сборку, создать библиотеку типов или обновить ссылку на библиотеку типов в VBA. Используйте ProcMon SysInternals, чтобы просмотреть его в реестре.   -  person Hans Passant    schedule 18.02.2012
comment
Посмотрите на аналогичный вопрос: Раннее связывание библиотека C # COM в VBA   -  person Maciej Los    schedule 30.12.2013