У нас есть компонент COM (назовем его MyLib), разработанный на VB.NET, для использования нашим приложением Access (назовем его MyApp). Для этого нам нужно выполнить регистрацию COM, используя сгенерированные файлы MyLib.dll и MyLib.tlb. Когда я устанавливаю оба файла в папку MyApp, все работает нормально, функция COM вызывается правильно. Однако у меня возникает ошибка, упомянутая в заголовке, когда я устанавливаю dll в общую папку - причина, по которой я это делаю, заключается в том, что мы хотим разрешить установку разных версий MyApp на одном компьютере. Поэтому, если компонент COM не меняется, мы, конечно, хотим поделиться им между этими разными версиями и позволить Windows выполнить подсчет ссылок.
Я не уверен, куда мне поместить файл MyLib.tlb: в установочную папку MyApp или в ту же общую папку, что и MyLib.dll. Но в любом случае я попробовал оба места, и все они дали одну и ту же ошибку. Я попытался сравнить файлы реестра между случаем, когда я помещал MyLib. * В папку MyApp, и случаем, когда я помещал MyLib.dll в общую папку. Я не вижу никакой разницы, кроме, конечно, CodeBase класса, который я пытаюсь зарегистрировать в HKCR \ Wow6432nodes \ CLSID {MYCLSID} \ InprocServer32. Еще я не понимаю, что в обоих случаях нет подключа с именем TypeLib в HKCR \ Wow6432nodes \ CLSID {MYCLSID}, что, как я понимаю, является способом связать TypeLib с dll (но почему он все еще работает когда я помещаю tlb и dll в одну папку?), поскольку в MyApp он знает только то, что есть ссылка, которую мы добавляем по ссылке MyLib.tlb.
Я не понимаю, как именно COM-ссылка работает для приложения Access, поэтому, если я ошибаюсь, поправьте меня. Кто-нибудь может сказать мне, что я сделал не так? Как правильно зарегистрировать общую DLL-библиотеку COM (независимо от того, помещать ли и dll, и tlb в общую папку или нет)? Спасибо!
ОБНОВИТЬ:
Что касается регистрации COM, я использую WIX для создания установщика Windows и heat.exe для сбора информации из файлов dll и tlb. Созданный файл включает информацию о тегах Class, ProgID, TypeLib и Registry. Как я уже упоминал, единственное различие между моими двумя случаями, с точки зрения конфигурации WIX, - это место, куда я помещаю файл MyLib.dll (я предполагаю, что размещение файла MyLib.tlb в папке установки MyApp является правильным способом, снова, пожалуйста, исправьте мой, если я ошибаюсь), и когда я помещаю файлы dll и tlb в папку установки приложения, это работает. Вот некоторая структура реестра после регистрации
Во-первых, у меня есть HKCR \ CLSID \ {MYCLSIDs}, каждый из которых представляет один из моих COM-классов. в подключе "InprocServer32" у меня есть Assembly, Class, CodeBase, RuntimeVersion, threadingModel. А CodeBase - это либо общая папка с файлами (не работает), либо папка установки MyApp (рабочая), то есть разные места, в которые я помещаю dll. Я думал, что будет еще один подключа TypeLib под {MYCLSIDs}, поскольку Access видит только TypeLib, и я думаю, что должна быть какая-то ссылка из TypeLib на фактическую dll, однако в обоих случаях этот подключа отсутствует, но в во втором случае он все еще работает. Есть ли в этом проблема?
Во-вторых, у меня есть HKLM \ Software \ Classes \ CLSID \ {MYCLSIDs}, этот ключ имеет такую же структуру, как описано выше.
В-третьих, HKCR \ {MYPROGIDs}, это просто ProgID моих классов
В-четвертых, HKCR \ Typelib \ {LibID}, который включает информацию из файла tlb, и этот идентификатор взят из GUID сборки проекта компонента COM.
Наконец, HKEY_CLASSES_ROOT \ Interface \ {InterfaceID}, есть подключи с именем ProxyStubClsid32 со значением {00020424-0000-0000-C000-000000000046}, а также с именем TypeLib и значением моего LibID.
Кажется, единственная разница - это CodeBase в первых элементах (я могу ошибаться, но это то, что я вижу). пожалуйста, дайте мне знать, если вы заметите какие-либо проблемы. Спасибо!
ВТОРОЕ ОБНОВЛЕНИЕ:
После установки MyLib.dll в общую папку вызов COM не выполняется. Но если я заменю все значения CodeBase для SHARED_FOLDER \ MyLib.dll на INSTALLDIR \ MyLib.dll и скопирую MyLib.dll в INSTALLDIR, это действительно сработает. И наоборот, после установки MyLib.dll в INSTALLDIR (в этом случае COM работает) я изменяю значения CodeBase с INSTALLDIR \ MyLib.dll на SHARED_FOLDER \ MyLib.dll и делаю копию в SHARED_FOLDER, на этот раз это не удается. Так что, похоже, проблема именно в месте установки, что противоречит моему пониманию COM. И я не думаю, что существует проблема с разрешением для SHARED_FOLDER (я могу ошибаться), поскольку он находится в папке, которую создает мой установщик.