1

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

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

由于包安装程序无法覆盖正在使用的文件,步骤 5 总是失败。这些文件是包安装程序本身从 app 文件夹加载的 DLL 。这些是对包安装程序没有直接或间接引用的 DLL。

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

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

发生了什么,我能做些什么来抑制额外 DLL 的加载?

4

1 回答 1

1

查看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";

于 2015-05-24T23:06:13.043 回答