Добавление ссылки 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-взаимодействием и записями реестра.