【问题标题】:EXE (plus dependant DLLs) copied to temp folder and launched still loads DLLs from original folderEXE(加上依赖的DLL)复制到临时文件夹并启动仍然从原始文件夹加载DLL
【发布时间】:2015-08-06 09:05:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 使用 Fuslogvw.exe,记录所有绑定。向我们展示它加载的其中一个 DLL 的跟踪。

标签: c# .net process.start assembly-loading


【解决方案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";

【讨论】:

  • 在 ProcessStartInfo 上设置 WorkingDirectory 有效(使用 UseShellExecute = false 没有)!谢谢!!
猜你喜欢
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2020-02-25
  • 2010-12-08
相关资源
最近更新 更多