У меня, похоже, возникают проблемы с тем, чтобы моя библиотека классов 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 и использовать раннее связывание:
не верно в моем случае ...: - (