EXE (плюс зависимые DLL), скопированные во временную папку и запущенные, по-прежнему загружают DLL из исходной папки
У меня есть основное приложение, которое использует отдельное приложение "Package Installer" для обновления, когда доступна более новая версия. Это обновление будет включать основное приложение, все зависимости DLL, а также сам установщик пакетов. Процесс работает так:
- Главное приложение обнаруживает, что доступно обновление версии
- Главное приложение копирует EXE установщика пакетов во временную папку, а также библиотеки DLL, от которых зависит, и библиотеку DLL, от которой они зависят. Другими словами, минимальные компоненты, необходимые для запуска установщика пакетов, копируются во временную папку.
- Основное приложение запускает установщик пакетов из временной папки, используя Process.Start
- Основное приложение закрывается
- Установщик пакетов копирует новые EXE-файлы и DLL-файлы в папку приложения
- Установщик пакетов снова запускает главное приложение
- Установщик пакетов выключается
Шаг 5 всегда не выполняется из-за того, что установщик пакетов не может перезаписать используемые файлы. Файлы представляют собой библиотеки DLL, которые сам установщик пакетов загрузил из папки приложения. Это библиотеки DLL, которые не имеют прямых или косвенных ссылок на установщик пакетов.
Я проверил (с помощью Windows Resource Monitor), что именно установщик пакетов (и только этот EXE) загрузил библиотеки DLL из папки приложения. Я также дважды проверил, что нет никаких ссылок из проекта Package Installer на эти DLL, ни напрямую, ни через другую DLL. Я также проверил, что установщик пакетов загружает библиотеки DLL, от которых он зависит (указанные выше 3), из временной папки.
Наконец, я попытался скопировать все приложение (каждый EXE и DLL) во временную папку перед запуском установщика пакетов, но даже тогда все еще есть некоторая DLL, которую он загружает из папки приложения (не те, что упомянуты выше на этот раз, но Сторонние DLL).
Что происходит и что я могу сделать, чтобы подавить загрузку дополнительных DLL?
1 ответ
Ознакомьтесь с документацией MSDN для ProcessStartInfo.WorkingDirectory. Отмечает, что When UseShellExecute is true, the working directory of the application that starts the executable is also the working directory of the executable.
ProcessStartInfo startInfo = new ProcessStartInfo("c:\\path\\to\\filename.exe");
startInfo.UseShellExecute = false;
Process.Start(startInfo);
И если это не сработает, попробуйте startInfo.WorkingDirectory = "c:\\path\\to";