EXE (плюс зависимые библиотеки DLL), скопированный во временную папку и запущенный, по-прежнему загружает библиотеки DLL из исходной папки

У меня есть основное приложение, которое использует отдельное приложение «Установщик пакетов» для самообновления, когда доступна более новая версия. Это обновление будет включать в себя основное приложение, все зависимости DLL, а также сам установщик пакетов. Процесс работает так:

  1. Главное приложение обнаруживает, что обновление версии доступно
  2. Основное приложение копирует EXE установщика пакетов во временную папку, а также библиотеки DLL, от которых он зависит, и DLL, от которой они зависят. Другими словами, минимальные компоненты, необходимые для запуска установщика пакетов, копируются во временную папку.
  3. Основное приложение запускает установщик пакетов из временной папки с помощью Process.Start
  4. Главное приложение закрывается
  5. Установщик пакетов копирует новые EXE и DLL в папку приложения.
  6. Установщик пакетов снова запускает основное приложение
  7. Установщик пакетов завершает работу

Шаг 5 всегда завершается ошибкой из-за того, что установщик пакетов не может перезаписать файлы, которые используются. Это файлы DLL, которые установщик пакетов загрузил из папки приложения. Это библиотеки DLL, которые не имеют прямых или косвенных ссылок на установщик пакетов.

Я подтвердил (используя Windows Resource Monitor), что именно установщик пакетов (и только этот EXE) загрузил библиотеки DLL из папки приложения. Я также дважды проверил, нет ли ссылок из проекта установщика пакетов на эти библиотеки DLL, напрямую или через другую DLL. Я также убедился, что установщик пакетов загружает библиотеки DLL, от которых он зависит (3 упомянутых выше), из временной папки.

Наконец, я попытался скопировать все приложение (все EXE и DLL) во временную папку перед запуском установщика пакетов, но даже тогда все еще есть какая-то DLL, которую он загружает из папки приложения (на этот раз не упомянутые выше, но Сторонние библиотеки DLL).

Что происходит и что я могу сделать, чтобы подавить загрузку дополнительных DLL?


person Laurence    schedule 24.05.2015    source источник
comment
Используйте Fuslogvw.exe, регистрируйте все привязки. Покажите нам трассировку для одной из загружаемых библиотек DLL.   -  person Hans Passant    schedule 25.05.2015


Ответы (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";

person ub3rst4r    schedule 24.05.2015
comment
Установка WorkingDirectory в ProcessStartInfo сработала (использование UseShellExecute = false не помогло)! Спасибо !! - person Laurence; 25.05.2015