Как добавить COM-выставленный проект.NET в диалог ссылок VB6 (или VBA)?
Я создал сборку.NET, которая доступна для COM в соответствии с исключительной статьей " Сборка и развертывание сборки.NET COM " Фила Уилсона.
И все работает нормально в том смысле, что сборка.NET правильно зарегистрирована для COM, и скомпилированный код COM может вызывать ее без каких-либо проблем.
Единственная странность заключается в том, что для разработки с использованием COM-сборки.NET при использовании VB 6.0 или VBA требуется, чтобы программист "нашел" точное местоположение файла соответствующего файла.tlb, после чего все работает нормально. Таким образом, библиотека классов не отображается непосредственно в диалоговом окне "Ссылки", поэтому необходимо перейти к расположению файла.
Опять же, аспекты COM Interop работают на 100%; Тем не менее, я думаю, что должна быть некоторая настройка, которая сделает библиотеку непосредственно видимой в диалоге "Ссылки" для VB 6.0 и VBA.
Кто-нибудь знает, что это за настройка? Или это должно происходить автоматически для меня, просто зарегистрировавшись?
Большое спасибо заранее за любые советы...
Майк
Редактировать /Update
Чтобы ответить на вопрос jpoh о том, использую ли я ключ / codebase, я использую установочный пакет.msi, а не явно использую RegAsm. Сборка правильно регистрируется, что видно по тому, что в HKCR\CLSID{myGUID}\InprocServer32 ключ CodeBase правильно хранит полный путь к сборке. Скомпилированные COM-компоненты работают с этой DLL просто отлично, только при разработке с использованием VB 6.0 или VBA они не отображаются в диалоговом окне ссылок. Поэтому мне нужно "найти" правильное местоположение файла, после чего он работает на 100% нормально.
Обновление № 2
После дальнейших исследований выясняется, что, хотя идентификаторы GUID класса регистрируются правильно, мой файл.tlb не регистрируется. Я понятия не имею, почему нет. При регистрации файла.tlb должны быть помещены некоторые записи реестра для интерфейса, на котором основан мой класс, по адресу HKCR\Interface{myInterfaceGUID}, но этого не происходит. Странно, что это отсутствие регистрации, по-видимому, не влияет на способность DLL функционировать, кроме ее обнаружения в диалоге ссылок VB6 и VBA.
Свойства моего файла.tlb в Проекте установки кажутся правильными: для свойства PackageAs установлено значение vsdpaDefault, а для свойства Register - vsdrfCOM. Я озадачен тем, почему это не будет успешно установлено на целевой машине.
Обновление № 3
Хорошо, оказывается, что проект установки не был успешно построен... несмотря на то, что он сообщает, что "Build Succeeded".
На самом деле есть предупреждение о сборке (удивительно, предупреждение, а не ошибка), сообщающее, что оно "Не удалось создать регистрационную информацию для имени файла" DotNetLibrary3.tlb "". Так как это было предупреждением, а не ошибкой, во время компиляции было указано "Build Succeeded", а список ошибок не открывался.
Отслеживая это, кажется, что это может быть проблемой при попытке создать Проект установки, когда Vista является вашей машиной разработки, как описано здесь:
Проблема регистрации COM typelib в проекте установки VS2008
Здесь описывается несколько ручное исправление:
Обратная связь: Невозможно создать регистрационную информацию для файла с именем 'filename'
Я еще не пробовал исправить это, но завтра сделаю и сообщу, если это решит проблему.
Обновление № 4
Это не сработало так хорошо... Кажется, что запуск RegCap.exe, как предложено в этой статье, не работает при работе в Vista. Поскольку RegCap фактически запускается внутренне самим проектом установки при создании.msi, это неудивительно. Короче говоря, проект установки почти наверняка потерпел неудачу, потому что команда RegCap, которую он вызывал, терпела неудачу... Так что непосредственный вызов RegCap не поможет.
Суть в том, что это просто ошибка при попытке создать установочный пакет в Vista. Или, может быть, это сочетание Visual Studio 2008 и Vista, я не уверен. Попытка точно такого же подхода состоит в том, чтобы создать проект установки на Visual Studio 2005, работающий на Windows XP, без каких-либо проблем.
Вполне возможно, что есть исправления для правильной работы в Vista и / или Visual Studio 2008, но я не смог отследить это. Гораздо более эффективным для меня было создание Visual Studio 2005 в Windows XP для генерации требований регистрации COM, а затем их импорт в мой проект установки Visual Studio 2008. Их можно экспортировать как файлы.REG через regasm, используя ключ /regfile для dll и используя RegCap (работающий на W'XP!) Для файла.tlb. Поскольку мои COM-интерфейсы не будут меняться, я должен сделать это только один раз.
Надеемся, что эта проблема в Visual Studio 2008 при работе в Vista будет исправлена в какой-то момент, но если нет, то, надеюсь, эта публикация будет иметь какую-то ценность для кого-то, кто окажется в той же ситуации...
Смотрите также:
- Майк
5 ответов
Я знаю, что это было давно, но я не могу найти разумных ответов. У меня была похожая проблема, и я решил запустить Visual Studio от имени того же пользователя, который ее установил. Если я запускаю его как другой пользователь, все, кроме регистрации COM, работает.
Записи реестра Typelib будут отсутствовать в реестре. Вам необходимо использовать regtlibv12 [путь]MyTypeLib.tlb из папки Microsoft.NET\framework\ для версии.NET, с которой вы собрали сборку. После этого дополнительные записи реестра будут существовать, и ссылки VBA смогут найти его. В качестве альтернативы для Windows 10 я использую regtlib.exe [путь]MyTypeLib.tlb в папке Windows. Затем необходимо повторно собрать сборку для вашего установщика, чтобы она теперь содержала записи typelib. Я лично использую инсталляторы wix и использую для этого "высокую температуру". Regasm /regfile не будет этого делать. Используйте высокую температуру как для DLL, так и для TLB, чтобы получить записи реестра classid и typelib.
Он не выдает предупреждение, если вы запускаете VS2008 под Vista, но не с повышенными правами. Повышенный уровень - это способ, которым мы (пользователи Vista) учимся всегда использовать эту вещь, но по этой причине по какой-то причине она нравится больше другим способом.
NB: хотя и повышен, мой запустил какую-то установку для SQL Server Tools, которую мне в итоге удалось пройти, но при запуске без повышенных прав он пытается сделать это снова и терпит неудачу с проблемами с разрешениями. Похоже, это не влияет на фактический результат сборки.
Вы можете использовать возможность генерировать TLB и ComVisibleAttribute в проектах .net, чтобы создать файл с расширением tlb для этого веб-сайта вместе с Ija dll. Теперь вы можете добавить этот файл в свой проект уровня com и пользоваться этой функцией. Но следует отметить, что требуется установка версии .NET, относящейся к основному проекту.