Что делает tlbimp, чего не делает Visual Studio IDE?

У меня есть COM-DLL, написанная на неуправляемом C++ и скомпилированная с помощью VS 2010. Я могу зарегистрировать DLL с помощью regsvr32 и вызывать ее через VBscript.

Когда я пытаюсь добавить ссылку на него, при создании клиента С# я не вижу COM-объект, указанный на вкладке «Добавить ссылку» -> «COM». Если я вручную перехожу к DLL и пытаюсь выбрать ее, он говорит, что DLL не является допустимой сборкой или компонентом COM.

Теперь я могу использовать инструмент tlbimp для создания DLL-библиотеки взаимодействия и использовать ее для добавления в качестве ссылки на мой клиент C#. И все работает нормально.

Мои вопросы:

  1. Почему исходный COM не указан на вкладке COM в диалоговом окне «Добавить ссылку», если он зарегистрирован через regsvr32?
  2. Почему VS IDE считает, что это недопустимый COM, когда я могу вызвать его из собственного кода VBScript и C++?
  3. Что именно делает tlbimp, чего не может сделать IDE?
  4. Что мне нужно прочитать дальше, чтобы лучше понять библиотеки типов и интероперабельность?

person Jaywalker    schedule 27.07.2012    source источник


Ответы (1)


Похоже на проблему с библиотекой типов - ваши COM-классы могут быть зарегистрированы правильно, но ваша библиотека типов, вероятно, нет. Может быть, вы забыли вызвать RegisterTypeLib из вашей функции DllRegisterServer?

Ссылаясь на ваши вопросы:

  1. Диалог ищет зарегистрированные библиотеки типов, а не классы COM.

  2. VBscript вызывает IDispatch и не заботится о библиотеках типов. tlbimp не заботится об IDispatch и требует typelib

  3. Вы передали имя DLL tlbimp, чтобы tlbimp знал, как получить библиотеку типов. VS, напротив, относится к реестру, в котором отсутствуют соответствующие регистрационные данные.

person Johannes Passing    schedule 27.07.2012