EXE(加上相关的 DLL)复制到临时文件夹并启动仍然从原始文件夹加载 DLL

EXE (plus dependant DLLs) copied to temp folder and launched still loads DLLs from original folder

我有一个主应用程序,它使用单独的 "Package Installer" 应用程序在有新版本可用时自行更新。此更新将包括主应用程序、所有 DLL 依赖项以及包安装程序本身。这个过程是这样的:

  1. 主应用检测到可用的版本升级
  2. 主应用程序将 Package Installer EXE 复制到一个临时文件夹,加上它所依赖的 DLL 和它们所依赖的 DLL。换句话说,运行 软件包安装程序所需的最少组件被复制到临时文件夹。
  3. 使用 Process.Start
  4. 的临时文件夹中的主应用程序 运行s 包安装程序
  5. 主应用程序关闭
  6. Package Installer 将新的 EXE 和 DLL 复制到应用程序文件夹中
  7. Package Installer 再次启动主应用程序
  8. 软件包安装程序关闭

第 5 步总是失败,因为软件包安装程序无法覆盖正在使用的文件。这些文件是 Package Installer 本身从应用程序文件夹 加载的 DLL 。这些是没有直接或间接引用包安装程序的 DLL。

我已经验证(使用 Windows 资源监视器)是包安装程序(并且只有那个 EXE)从应用程序文件夹加载了 DLL。我还仔细检查了 Package Installer 项目没有直接或通过另一个 DLL 引用这些 DLL。我还验证了包安装程序从临时文件夹加载它依赖的 DLL(上面提到的 3 个)。

最后,我尝试在 运行 安装程序包安装程序之前将整个应用程序(每个 EXE 和 DLL)复制到临时文件夹中,但即便如此,它仍然会从应用程序文件夹中加载一些 DLL (这次不是上面提到的那些,而是第 3 方 DLL)。

这是怎么回事,我该怎么做才能抑制额外 DLL 的加载?

查看 ProcessStartInfo.WorkingDirectory 的 MSDN 文档。它指出 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";