Вызов regasm без административных прав для COM-взаимодействия в Excel VBA
Обходной путь для вызова regasm без прав администратора был описан здесь уже:
Я пытаюсь создать библиотеку COM, которую мои пользователи могут развертывать и использовать из Excel VBA без прав администратора. Мне понравился обходной путь regasm, так как кажется, что люди не имеют большого успеха с использованием COM-объектов без регистрации из Excel VBA. Я также хочу раннее связывание, чтобы мои пользователи могли получить пользу от завершения синтаксиса.
Принятый ответ на вопрос, упомянутый выше, однако, не описывает, где разместить сборку DLL на компьютере пользователя. Права администратора требуются для установки сборки в GAC, поэтому мне интересно, где можно поместить файл DLL. Я предполагаю, что в директории приложения выполняется поиск любых упомянутых dll, но я не могу снова поместить свою dll в директорию Excel без прав администратора. Можно ли использовать обходной путь с клиентом Excel? Есть ли другой способ вызова COM-объектов из VBA без необходимости привилегий администратора для их предварительного развертывания?
2 ответа
Вызов regasm без административных прав для COM-взаимодействия
Я думаю, что это должно быть возможно использовать RegistrationServices.RegisterAssembly
а также RegOverridePredefKey
API вместе для реализации автоматической регистрации под HKCU
улей, в UAC-дружественной форме. Я разместил более подробный ответ здесь.
Да, теперь у вас есть две проблемы, вы не можете поместить их в любое место, куда вы должны их поместить, например, в подкаталог GAC или a c:\program files. Поскольку эти места также требуют повышения UAC. Вы, вероятно, также забыли запустить Regasm.exe с параметром / codebase, обязательным для указания CLR, где искать файл.
У пользователя должно быть достаточно прав для копирования библиотеки DLL в каталог, к которому у него есть права на запись. Обычно это только каталог в каталоге c:\users\username, например, подкаталог appdata. Головная боль, с которой вам придется столкнуться, заключается в том, что файл.reg необходимо адаптировать для каждого отдельного пользователя, поскольку его имя пользователя отличается. Итак CodeBase
Значение в файле.reg необходимо изменить для каждого пользователя. Это плохо масштабируется, мягко говоря.
Ответ, который вы нашли, просто не очень хороший. Единственное решение, которое действительно работает, это написать свою собственную функцию регистрации. Тот, который записывает ключи реестра в HKCU вместо HKLM. Используйте атрибут [ComRegisterFunction]. Вы знаете из файла.reg, какие ключи вам нужно написать. И вы используете Assembly.GetExecutingAssembly(). Расположение, чтобы выяснить, что писать для значения реестра CodeBase. Не забудьте функцию [ComUnregisterFunction].
Имейте в виду, что, по крайней мере в духе, вы пытаетесь преодолеть ограничения, которые администратор локальной сети наложил на этих пользователей. Им очень важно знать, какой код выполняется на машинах, которые они поддерживают. Это может привести к неприятностям, по крайней мере, поговорить с парнем.