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-файл. Но теперь, когда я знаю необходимые записи, это тривиально.