Registering.Net com DLL без прав администратора / regasm
недавно я написал библиотеку классов на C# для использования в приложениях Office, включая критическое приложение доступа, используемое ~70 людьми. Для пользователей с правами администратора Регистрация DLL тривиальна, но получить DLL, работающую на других машинах, было проблематично.
Регистрация DLL для использования с правами администратора
- создайте DLL в Visual Studio. Убедитесь, что эти параметры выбраны вприложение табуляция:
- Тип Выхода: Библиотека Класс
- Сведения О Сборке: сделать сборку видимой для COM: проверено
- используйте командную строку с повышенными правами для регистрации сборки:
RegAsm YourDll.dll /tlb /codebase
- добавить ссылку
YourDll.tlb
в VBA: инструменты - >ссылки - убедитесь, что вы можете создать экземпляр объект
что происходит?
Regasm делает здесь несколько вещей. Во-первых, это создание тип библиотеки (библиотеки DLL.tlb), который предоставляет информацию о классах, которые находятся в вашей DLL. Во-вторых, он хранит информацию о библиотеке в реестре, чтобы система "знала", что вы имеете в виду, когда просите создать экземпляр класса в качестве объекта.
чтобы увидеть, какие записи реестра Regasm добавляет, Вы можете запустить его с помощью /regfile
параметр:
Regasm YourDLL.dll /codebase /regfile
(The /regfile
опция недопустима с
1 ответов
настройка файлов реестра
чтобы зарегистрировать компоненты для использования в 32-и 64-битных средах, нам необходимо изменить файл реестра, созданный в нашем тестовом примере. Откройте его с помощью любимого текстового редактора. Записи должны выглядеть примерно так:
[HKEY_CLASSES_ROOT\YourAssembly.Class] @="YourAssembly.Class" [HKEY_CLASSES_ROOT\YourAssembly.Class\CLSID] @="{YourClassGUID}"
убедитесь, что он включает "CodeBase"=
записи.
сделайте глобальный поиск / замену:
- изменить
HKEY_CLASSES_ROOT
(который сглаживается доHKLM\Software\Classes
) - до
HKEY_CURRENT_USER\Software\Classes
скопируйте все ключи реестра (и их значения, которые перечислены ниже ключей) во второй текстовый файл. Во втором текстовом файле:
- удалить все ключи (и связанные с ними значения), которые не содержат
\CLSID\
- сделать глобальный поиск/замена:
- изменить
Classes\CLSID
- в:
Classes\Wow6432Node\CLSID
- изменить
скопируйте все ключи из второй текстовый файл к оригиналу .reg-файл и сохранить его.
удалить регистрационные записи из HKLM
С помощью regasm:
Regasm YourDLL.dll /unregister
убедитесь, что вещи не работают
чтобы убедиться, что наше изменение сработало (и что вы не просто успешны из-за регистрации, которую вы сделали с regasm изначально), нам нужно убедиться, что VBA не может создать объект прямо сейчас.
откройте свой любимый VBA приложение, и добавить ссылку на YourDLL.tlb
. Создайте новую процедуру, которая выглядит примерно так:
Public Sub TestYourDLL()
Dim x as AssemblyName.ClassName
Set x = New AssemblyName.ClassName
Debug.Print "Apparently this worked."
End Sub
выполнить TestYourDLL
. Вы должны получить сообщение об ошибке:
Run-time error '429': ActiveX component can't create object
(если вы не получили сообщение об ошибке, ваша DLL все еще зарегистрирована.)
сохранить и выйти из приложения VBA.
убедившись, что они работают
выполнитьYourDLL.reg
что вы создали ранее, чтобы импортировать записи в реестр. (Если вы получите " доступ отказано " сообщение, вы забыли изменить с HKEY_CLASSES_ROOT
to HKEY_CURRENT_USER\Software\Classes
)
Откройте приложение VBA еще раз и запустите TestYourDLL
. Теперь вы должны увидеть " по-видимому, это сработало."в ближайшем окне. Поздравляю! Вы зарегистрировали DLL! (Если вы получаете "ошибка автоматизации: Система не может найти указанный файл" - тип ошибки, файл реестра либо отсутствует Codebase
записи, или они не указывают на фактическое местоположение вашей DLL.)
дополнительные шаги
в моем случае я собираюсь установить DLL на кучу компьютеров других пользователей вместе с моим приложением, поэтому во время установки я обновлю CodeBase
значение для ссылки на место, где я устанавливаю DLL, и я также установлю записи реестра через код, а не путем выполнения.reg-файл. Но теперь, когда я знаю необходимые записи, это тривиально.