Как добавить COM-выставленный проект .NET в диалог ссылок VB6 (или VBA)? - PullRequest
9 голосов
/ 13 апреля 2009

Я создал сборку .NET, которая доступна для COM в соответствии с исключительной статьей Сборка и развертывание сборки .NET COM . Автор Phil Wilson.

И все работает нормально в том смысле, что сборка .NET правильно зарегистрирована для COM, и скомпилированный код COM может вызывать ее без каких-либо проблем.

Единственная странность состоит в том, что для разработки на основе COM-сборки .NET при использовании VB 6.0 или VBA требуется, чтобы программист "нашел" точное местоположение файла соответствующего файла .tlb, после чего все работает нормально. Таким образом, библиотека классов не отображается непосредственно в диалоговом окне «Ссылки», поэтому необходимо найти местоположение файла.

Опять же, аспекты COM Interop работают на 100%; Тем не менее, я думаю, что должна быть некоторая настройка, которая сделает библиотеку непосредственно видимой в диалоге «Ссылки» для VB 6.0 и VBA.

Кто-нибудь знает, какой будет эта настройка? Или это должно происходить автоматически для меня, просто зарегистрировавшись?

Большое спасибо заранее за любые советы ...

Mike

Редактировать / обновить

Чтобы ответить на вопрос 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 будет исправлена ​​в какой-то момент, но если нет, то, надеюсь, эта публикация будет иметь какую-то ценность для кого-то, кто окажется в той же ситуации ...

Смотрите также:

Как получить COM Server для Excel, написанный на VB.NET, установленный и зарегистрированный в списке серверов автоматизации?

- Майк

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Я знаю, что это было давно, но я не могу найти разумных ответов. У меня была похожая проблема, и я решил запустить Visual Studio от имени того же пользователя, который ее установил. Если я запускаю его как другой пользователь, все, кроме регистрации COM, работает.

2 голосов
/ 13 апреля 2009

Включена ли в вашу команду regasm флаг /codebase?

0 голосов
/ 23 сентября 2016

Записи реестра Typelib будут отсутствовать в реестре. Вам необходимо использовать regtlibv12 [path] MyTypeLib.tlb из папки Microsoft.NET \ framework \ для версии .NET, с которой вы собрали сборку. После этого дополнительные записи реестра будут существовать, и ссылки VBA смогут найти его. В качестве альтернативы для Windows 10 я использую regtlib.exe [путь] MyTypeLib.tlb в папке Windows Затем вы должны собрать сборку для вашего установщика, чтобы она теперь содержала записи typelib. Я лично использую установщики wix и использую для этого «высокую температуру». Regasm / regfile не будет этого делать. Используйте heat для файлов .dll и .tlb, чтобы получить записи реестра classid и typelib

0 голосов
/ 22 июля 2009

Не выдает предупреждение, если вы запускаете VS2008 под Vista, но не повышено . Повышенный уровень - это способ, которым мы (пользователи Vista) учимся всегда использовать эту вещь, но по какой-то причине ей это нравится больше, чем другим.

N.B .: Несмотря на то, что у меня повышенные права, я запустил какую-то установку для SQL Server Tools, которую мне в итоге удалось пройти, но при запуске без повышенных прав он пытается сделать это снова и терпит неудачу с проблемами с разрешениями. Тем не менее, это не влияет на фактический результат сборки.

...