gpt4 book ai didi

c# - UseShellExecute 有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 21:29:15 30 4
gpt4 key购买 nike

我正在从我的 IIS Web 应用程序中启动一个小型控制台应用程序。代码是从应用程序池中使用这样的代码启动的,

Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();

processStartInfo.CreateNoWindow = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

// ..

process.Start();

我曾经间歇性地得到一个错误,

Win32Exception exception has occured  Message: No such interface supported
ErrorCode: 80004005 NativeErrorCode: 80004002

我证明,当发生这种情况时,控制台应用程序根本无法启动。

我在上面的代码中添加了这个,

processStartInfo.UseShellExecute = false;

问题已经解决了(到目前为止,祝你好运)。我知道通过进行此更改不需要有效的桌面上下文即可运行,但这到底是什么意思。如果这意味着如果没有桌面(适用于以系统用户运行的 IIS 应用程序池)我们无法运行上述代码,那么为什么它过去有时会运行而不是每次都失败?

有人知道为什么这会有所作为吗?在这种情况下,不支持的接口(interface)是什么意思?

更新:

我采纳了人们所说的一切,并且自己做了更多研究。所以总而言之,如果您有 UseShellExecute = true(这是默认值),那么它将调用 shell32.dll 中的 ShellExecuteEX 来执行该过程。它实际上会这样做(使用 ILSpy 从 System.dll 复制),

public bool ShellExecuteOnSTAThread()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
ThreadStart start = new ThreadStart(this.ShellExecuteFunction);
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
else
{
this.ShellExecuteFunction();
}
return this._succeeded;
}

如果你有 UseShellExecute = false 那么它将调用 kernel32.dll 中的 CreateProcess 来启动进程。

我想知道上面的代码 ShellExecuteOnSTAThread 创建新线程是否有问题?应用程序池能否达到可能间接导致 Win32Exception 的线程限制?

最佳答案

当某些 COM 对象未注册时,可能会发生此错误,尽管我对它为什么间歇性出现有点不解。

但公平地说,从 IIS 中生成本地可执行文件是一件非常罕见的事情,它实际上可能会导致安全问题,或者至少会导致 IIS 出现问题,如果命令由于某种原因失败并且不会将控制权交还给系统。

实际上,此类操作的最佳做​​法是在注册表、数据库或某种设置文件中记录您需要执行的操作,并让您的本地应用程序作为计划任务或 Windows 服务运行。

作为引用,UseShellExec 声明了内核是应该直接启动 exe,还是应该要求资源管理器启动文件。

当没有人登录时,您可能会遇到这个问题,因此不一定要加载 shell 来启动 exe。

归根结底,您目前正在尝试做的事情在生产环境中是一件坏事 - 当 IIS 尝试启动此 exe 时,您无法保证 IIS 的状态,因此,IIS 不是 Shell。

关于c# - UseShellExecute 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238384/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com