Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EXE(加上从属DLL)已复制到临时文件夹并启动,但仍从原始文件夹加载DLL_C#_.net_Process.start_Assembly Loading - Fatal编程技术网

C# EXE(加上从属DLL)已复制到临时文件夹并启动,但仍从原始文件夹加载DLL

C# EXE(加上从属DLL)已复制到临时文件夹并启动,但仍从原始文件夹加载DLL,c#,.net,process.start,assembly-loading,C#,.net,Process.start,Assembly Loading,我有一个主应用程序,它使用一个单独的“软件包安装程序”应用程序在更新版本可用时进行自我更新。此更新将包括主应用程序、所有DLL依赖项以及软件包安装程序本身。过程如下所示: 主应用程序检测到版本升级可用 主应用程序将软件包安装程序EXE复制到临时文件夹,以及它所依赖的DLL和它们所依赖的DLL。换句话说,运行软件包安装程序所需的最少组件被复制到temp文件夹 主应用程序使用Process.Start从临时文件夹运行软件包安装程序 主应用程序关闭 软件包安装程序将新的EXE和DLL复制到应用程序文件

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

  • 主应用程序检测到版本升级可用
  • 主应用程序将软件包安装程序EXE复制到临时文件夹,以及它所依赖的DLL和它们所依赖的DLL。换句话说,运行软件包安装程序所需的最少组件被复制到temp文件夹
  • 主应用程序使用Process.Start从临时文件夹运行软件包安装程序
  • 主应用程序关闭
  • 软件包安装程序将新的EXE和DLL复制到应用程序文件夹中
  • 软件包安装程序再次启动主应用程序
  • 软件包安装程序关闭
  • 由于软件包安装程序无法覆盖正在使用的文件,步骤5始终失败。这些文件是软件包安装程序本身从应用程序文件夹加载的DLL。这些DLL没有对包安装程序的直接或间接引用

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

    最后,在运行软件包安装程序之前,我尝试将整个应用程序(每个EXE&DLL)复制到temp文件夹中,但即使如此,仍有一些DLL从应用程序文件夹中加载(这次不是上面提到的,而是第三方DLL)


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

    查看MSDN文档以了解更多信息。它注意到
    当UseShellExecute为true时,启动可执行文件的应用程序的工作目录也是可执行文件的工作目录。

    ProcessStartInfo startInfo = new ProcessStartInfo("c:\\path\\to\\filename.exe");
    startInfo.UseShellExecute = false;
    Process.Start(startInfo);
    

    如果不起作用,请尝试
    startInfo.WorkingDirectory=“c:\\path\\to”

    使用Fuslogvw.exe,记录所有绑定。向我们显示它加载的DLL之一的跟踪。在ProcessStartInfo上设置WorkingDirectory已起作用(使用UseShellExecute=false未起作用)!谢谢