EXE(加上依赖的dll)复制到临时文件夹和启动仍然加载dll从原始文件夹

本文关键字:dll 文件夹 启动 原始 加载 依赖 EXE 复制 | 更新日期: 2023-09-27 17:50:32

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

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

步骤5总是失败,因为包安装程序无法覆盖正在使用的文件。这些文件是包安装程序自己从app文件夹中加载的dll。这些dll没有直接或间接引用包安装程序。

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

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

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

EXE(加上依赖的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";