Можно ли использовать бесплатный бесплатный COM с Dotnet interop и С#? Если да, то как добавить ссылку на объект COM в проекте С#?
У меня есть бесплатная версия ATL COM-сервера с встроенным манифестом и двумя тестовыми клиентами, одна cpp другая С#. Клиент cpp правильно ссылается на COM-объект, используя оператор import, и
#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"")
или установите для параметра "Дополнительные манифесты манифеста" значение "type = 'win32" name=' TestComSvr1 'version =' 1.0.0.0 '' в разделе "Параметры Linker- > Manifest File", после чего клиент cpp будет работать правильно так долго поскольку COM-компонент находится в одном каталоге.
Клиент С#, хотя и отказывается играть вообще.
Попытка добавить ссылку на файл для DLL незарегистрированного COM-компонента или незарегистрированного tlb приводит к ошибке:
"Ссылка на" бла-бла "не может быть добавлена. Убедитесь, что файл доступен, и что он является допустимой сборкой или COM-компонентом".
Регистрация только библиотеки типов с помощью "regtlib TestComSvr", а затем создание либо файла, либо ссылки на COM, что приводит к тому, что проект С# не создается с помощью:
"Ошибка загрузки библиотеки типов /Dll. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))".
Регистрация компонента COM и создание ссылки обычно в проекте С#, установка ссылки на Изолированный, создание проекта С#, а затем отмена регистрации компонента и запуск проекта С# в этом исключении:
Извлечение COM-класса factory для компонента с CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Примечание. Даже если это сработало, это все равно не будет полезным, так как в конечном счете он все еще требует регистрации компонента, я просто проверил его для тщательности.
До сих пор единственным способом, с помощью которого я мог ссылаться на COM-объект из С# вообще, является регистрация самого COM-объекта, который, конечно же, полностью побеждает точку с тех пор, когда она вообще не является reg-free.
У кого-нибудь есть идеи?
(Это на WinXP с VS2010 sp1).