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