System.ComponentModel.Win32Exception (0x80004005): 不支持此类接口

The*_*lTy 6 .net c# process windows-server-2008

由 Windows 服务启动的程序有问题。

流程是

  • exe启动
  • 将自身重命名为 *.bak
  • 下载自身的最新版本
  • 电话 Restart()
  • 执行一堆文件和 SQL 操作(更新我们的主要软件套件)
  • 然后调用 Restart()
  • 流程再次开始。如果主套件没有软件更新,则不会重新启动

除了一个客户站点外,这一切都很完美

在一个站点上,第一个Restart()有效,但第二个总是抛出异常。

System.ComponentModel.Win32Exception (0x80004005): System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() at UpdateCompanionService.Program.Restart() 不支持这样的接口

它是一个 WS2008 标准服务器。

public static void Restart()
{
  try
  {
      var procPath = Path.Combine(Config.UpdateCompanionDirectory, "UpdateCompanionService.exe");
      Logger.Debug("Starting procecss {0}", procPath);

      var proc = new Process
      {
          StartInfo = {FileName = procPath, WorkingDirectory = Config.UpdateCompanionDirectory, Arguments = "/noupdate", UseShellExecute = true}
      };

      proc.Start();
      Environment.Exit(-1);
  }
  catch (Exception e)
  {
      Logger.Fatal("Error restarting update companion", e);
  }
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ove 6

尝试使用

    UseShellExecute = false 
Run Code Online (Sandbox Code Playgroud)

众所周知,它可以解决这个问题


Rai*_*ack 4

你可以尝试在你的代码中设置UseShellExecute = false

我记得很久以前我自己的一些问题,我什至重新编译了原始的.NET框架代码,发现设置这个标志使用了完全不同的启动方法。

UseShellExecute = true对我来说,你的情况似乎不需要。

如果这不起作用,您应该检查安全上下文/GPO 设置,例如“此服务是否以系统或(域)用户身份运行?”

还要确保您的新 EXE 以及所有附加组件在您尝试重新启动时已“准备就绪”(也许您使用了未完成的后台线程)。