Призывая Regasm без административных прав для Com Interop в Excel VBA
-
26-12-2019 - |
Вопрос
Обходной путь для вызова REGOM без права администратора был описан здесь:
Я пытаюсь создать COM-библиотеку, которую мои пользователи могут развернуть и использовать из Excel VBA без привилегий Admin. Мне понравилась обходной путь в ответ, так как кажется, что у людей не имеет большого успеха с использованием без регистрации COM-объектов из Excel VBA. Я также хочу раннее связывание, чтобы мои пользователи могли извлечь выгоду из завершенности синтаксиса.
Принятый ответ в вопросе, упомянутой выше, однако не описывает, где поставить монтаж DLL на компьютер пользователя. Права администратора необходимы для установки сборки в GAC, поэтому я задаюсь вопросом, где можно поставить файл DLL. Я предполагаю, что дир приложения ищет любые ссылочные DLL, но я не могу поставить мою DLL в Dir Excel без права администратора. Можно ли использовать обходной путь с клиентом Excel? Есть ли другой способ позвонить в COM объекты от VBA без необходимости привилегий администратора, чтобы сначала развернуть их?
Решение
Призывая Регион без административных прав для COM Interop
Я думаю, что следует использовать RegistrationServices.RegisterAssembly
и RegOverridePredefKey
API вместе, чтобы реализовать автоматическую регистрацию под улей HKCU
, в UAC-дружественнице.Я разместил более подробный ответ здесь .
Другие советы
Да, теперь у вас есть две проблемы, вы не можете поставить его нигде Должен поставить его, как GAC или C: \ Program Files подкаталог. Поскольку эти места также требуют высоты UAC. Вы, вероятно, также забыли запустить Regasm.exe с опцией / codebase / codebase, необходимой для того, чтобы сказать CLR, где искать файл.
Пользователь должен иметь достаточно привилегий для копирования DLL в каталог, к которому он имеет доступ для записи. Обычно это только каталог в C: \ пользователях \ username, как подкаталог AppData. Головная боль, которой вы должны обратиться к тому, что файл .reg должен быть адаптирован для каждого отдельного пользователя, поскольку его имя пользователя отличается. Таким образом, значение CodeBase
в файле .reg должна быть изменена для каждого пользователя. Это масштабируется плохо, мягко говоря.
Ответ, который вы нашли, просто не очень хороший. Единственное решение, которое действительно работает, заключается в том, чтобы написать свою собственную регистрационную функцию. Тот, который пишет ключи реестра в HKCU вместо HKLM. Используйте ComegisterFunction] Атрибут . Вы знаете из файла .reg Какие ключи нужно написать. И вы используете сборку. GetExecutingSashbly (). Расположение, чтобы выяснить, что написать для значения реестра CodeBase. Не забывайте [Comunregisterfunction].
Имейте в виду, что, по крайней мере, в духе, вы пытаетесь отправиться на ограничения, которые администратор локальной сети налагается на этих пользователей. Они очень заботятся о том, что знают, какой код работает на машинах, которые они поддерживают. Это вполне может доставить вас в беду, по крайней мере, поговорить с парнем.