Добавление ссылки VB6 в Visual Studio дает "Импорт библиотеки типов обнаружил ошибку при проверке типа"

Я нахожусь в процессе преобразования довольно крупного проекта, написанного на VB6, в C#. Учитывая масштаб проекта, который он переносит, он осуществляется поэтапно в течение 18 месяцев. Я сталкиваюсь с проблемой с добавлением ссылки DLL ActiveX VB6 к проекту.Net.

Если вы точно выполните эти шаги, вы тоже сможете воссоздать проблему.

Я написал интерфейс в.Net, который является видимым COM:

<ComVisible(True)>
Public Interface ITestInterface
    Property A As String
    Function TestMethod() As String
End Interface

Выбрав "Зарегистрироваться для COM-взаимодействия" на вкладке "Компиляция" свойств проекта, вы получите файл TLB.

Я создал проект VB6, который ссылается на этот TLB, и класс, который реализует представленный интерфейс.

Implements ITestInterface

Private mA As String

Public Property Get ITestInterface_A() As String
    ITestInterface_A = mA
End Property

Public Property Let ITestInterface_A(ByVal value As String)
    mA = value
End Property

Public Function ITestInterface_TestMethod() As String
    ITestInterface_TestMethod = "From VB6"
End Function

Если я установлю на вкладке Компонент свойств проекта в VB6 использование "Удаленных файлов сервера", то при компиляции автоматически создается TLB. Я могу просмотреть этот TLB в OleView и увидеть следующее (в дополнение к деталям конкретной реализации, выполненной в VB6 интерфейса, определенного в проекте.Net):

// typelib filename: TestVB6Interface.dll

[
  uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**),
  version(3.0)
]

// ... some other stuff

// TLib :     // TLib :  : {79EC733A-0267-4506-8D38-C4D4655E0755}
importlib("SimpleDotNetLibrary.tlb");

Теперь я создаю совершенно новый проект.Net. Если я добавлю ссылку на VB6 DLL, я получаю следующую ошибку:

Не удалось разрешить ссылку COM "ef005573-bfc7-436d-a382-f906ca09f94a" версии 3.0. Импортер библиотеки типов обнаружил ошибку при проверке типа. Попробуйте импортировать без членов класса.

Однако, если я запускаю командную строку Visual Studio и запускаю следующее:

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll

Затем я могу добавить эту DLL в качестве ссылки в моем решении.Net, и она прекрасно работает.

Мой вопрос. Что делает tlbimp в командной строке, чего не происходит, когда я просто добавляю ссылку напрямую? Когда сообщение в Visual Studio говорит "попробуйте импортировать без членов класса", как именно это сделать в Visual Studio? Я знаю, как это сделать в tlbimp.

Я прошу прощения за стену текста, но я хотел описать ситуацию как можно лучше, сохраняя информацию, которая, по моему мнению, была актуальной.

1 ответ

Среда IDE Visual Studio определенно использует другой путь при регистрации DLL для COM-взаимодействия, чем при запуске инструментов командной строки из командной строки.

Я сомневаюсь, что Microsoft зафиксировала это где угодно. Тем не менее, мой многолетний опыт доказал, что это так. Однажды я столкнулся с ситуацией, когда команда "regsvcs" из.NET 2.0 Framework фактически вызвала бы бесконечный цикл. Если вы воспользуетесь Google, вы наверняка найдете других, у которых возникла эта проблема Я смог сделать это еще на один шаг, используя VS IDE для регистрации COM обслуживаемого компонента.NET. Однако это неизбежно закончилось ошибкой. Ошибка была шагом вперед по бесконечному циклу. В любом случае это доказало мне, что VS IDE использует другой путь кода / бизнес-логику при работе с COM-взаимодействием и записями реестра.

Другие вопросы по тегам