Недавно я написал библиотеку классов в С# для использования в приложениях Office, включая критическое приложение Access, используемое ~ 70 людьми. Для пользователей с правами администратора регистрация DLL тривиальна, но получение DLL, работающей на других машинах, было проблематичным.
Регистрация DLL для использования с правами администратора
- Создайте DLL в Visual Studio. Убедитесь, что эти параметры выбраны на вкладке Прикладная проекта:
- Тип вывода: библиотека классов
- Информация о сборке: сделать сборку COM-видимой: проверено
- Используйте командную строку с повышенными правами для регистрации сборки:
-
RegAsm YourDll.dll /tlb /codebase
-
- Добавить ссылку на
YourDll.tlb
в VBA: Инструменты → Ссылки - Убедитесь, что вы можете создать экземпляр своего объекта
Что происходит?
Regasm здесь делает несколько вещей. Во-первых, он создает библиотеку типов (YourDLL.tlb), которая предоставляет информацию о классах, которые находятся в вашей DLL. Во-вторых, он хранит информацию о библиотеке в реестре, чтобы система "знала", что вы имеете в виду, когда вы просите создать экземпляр класса как объекта.
Чтобы узнать, какие записи реестра добавляется Regasm, вы можете запустить его с параметром /regfile
:
Regasm YourDLL.dll /codebase /regfile
(Параметр /regfile
недействителен с параметром /tlb
.)
Если параметр /codebase
сообщает Regasm включить информацию о том, где YourDLL.dll
находится на диске, что важно для создания объектов.
Если вы откроете YourDLL.reg
в текстовом редакторе, вы увидите записи, которые Regasm добавляет в реестр: записи в HKEY_Classes_Root
(что на самом деле является просто перенаправлением на HKLM\Software\Classes
). К сожалению, вам нужны права администратора для изменения HKLM
, поэтому это не будет работать для других наших пользователей.
Есть несколько других потоков (например Регистрация COM без прав администратора, Зарегистрировать COM DLL для использования VBA, Регистрация DLL (ActiveX) для пользователей, не являющихся администраторами, Невозможно зарегистрировать .NET COM DLL, COM Interop без regasm), которые обсуждают проблему, но их решения сложны (например, требуют перенаправления реестра) или неполные (предположим, что вы уже знаете, по крайней мере, половину ответа) или не работают в смешанных средах с 64/32 бит (например, Win64, Office32).
Итак, как вы регистрируете COM-DLL, созданную в Visual Studio, для использования в VBA 32 и 64-разрядных средах для текущего пользователя без административных привилегий?