Есть ли версия regsvr32 для .NET или Win32? Я хотел бы зарегистрировать COM-DLL с кодом вместо того, чтобы обходить программу regsvr32.Есть ли версия regsvr32 .NET или Win32?
ответ
Стандартный способ регистрации сборки - вызвать функцию экспорта DllRegisterServer
на сборку.
В упрощенном виде regsvr32 существу выполняет следующие действия (проверка ошибок опущено для краткости).
HANDLE lib = LoadLibrary(...);
FARPROC proc = GetProcAddress(lib, "DllRegisterServer");
proc();
Я считаю, что вы просто загрузить DLL, а затем вызвать его на экспорт DllRegisterServer()
функцию.
Да, это просто требует вызова экспортируемой функции. Тем не менее, дьявол находится в деталях. DLL будет загружать все свои неявно связанные зависимые DLL. И их точки доступа DllMain() будут запущены. Это хорошо в простом процессе, таком как regsvr32, не так хорошо в вашем, что нужно выжить за пределами регистрационного шага.
Затем вы получаете разрешения на запись в реестр. UAC определенно остановит это, как для запуска Regsvr32, так и для вызова точки входа напрямую. Чтобы получить разрешение от пользователя, вам понадобится отдельный EXE с манифестом, который запрашивает права администратора. Ты не впереди.
Обратитесь к бесплатному COM-сообществу, предоставив регистрационную информацию в манифесте. Вам больше не придется регистрировать DLL. Вы получите много хитов, если будете искать этот термин.
Моя цель - приложение, которое может установить себя, если вы передадите правильный ключ командной строки, поэтому у меня нет проблем с выходом после вызова DllRegisterServer. Но reg-free COM звучит интересно. –
Я пропустил что-то или не reg-free COM действительно так же просто, как просто установка 'isol' в true? –
Не бойтесь, отдельные приложения хранят свои библиотеки DLL в бок о бок. Подобный вид манифеста hanky-panky. –
Я действительно надеялся ответить 'InstallUtil';) – leppie
Если reg-free COM не работает для меня, я, вероятно, в конечном итоге напишу класс, совместимый с InstallUtil. –
InstallUtil тоже не может работать, у вас нет необходимых разрешений. Не то, чтобы он был разработан для COM BT. –