以编程方式启动独立于平台的流程

本文关键字:平台 方式 编程 启动 独立 于平台 | 更新日期: 2023-09-27 17:49:20

情况

我正在尝试以编程方式运行命令行工具DISM.exe。当我手动运行它时,它是有效的,但当我尝试用以下方法生成它时:

var systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
var dism = new Process();
dism.StartInfo.FileName = Path.Combine(systemPath, "Dism.exe");
dism.StartInfo.Arguments = "/Online /Get-Features /Format:Table";
dism.StartInfo.Verb = "runas";
dism.StartInfo.UseShellExecute = false;
dism.StartInfo.RedirectStandardOutput = true;
dism.Start();
var result = dism.StandardOutput.ReadToEnd();
dism.WaitForExit();

然后我的result显示为:

错误:11

无法使用32位版本的DISM为正在运行的64位操作系统提供服务。请使用与计算机体系结构相对应的DISM版本。

问题

事实上,我已经意识到造成这种情况的原因:我的项目是为x86平台进行编译而设置的。(例如,请参阅这个问题,尽管没有一个答案提到这一点(。然而,不幸的是,目前我们需要继续瞄准这个平台,我无法通过切换到任何CPU来解决这个问题。

因此,我的问题是如何以独立于其父平台的方式以编程方式生成一个进程,即保持我的项目以x86为目标,但启动一个针对其所在机器的正确平台的进程

即使我在System32 中运行正确的DSIM.exe

但你不是。这就是重点。文件系统重定向器指向32位进程,因此当您从x86进程请求System32时,实际上是从SysWow64获得文件。如果你想访问64位exe,你需要通过%windir%'sysnative 请求它

(%windir%SpecialFolder.Windows(

以编程方式启动独立于平台的流程

虽然它不能回答您关于从32位启动64位进程的问题,但解决潜在问题的另一种方法是查询WMI以获取所需信息。您可以列出可选功能或列出服务器功能

这个答案提供了有关从C#执行WMI查询的一般信息。

您也可以从powershell检查并安装windows功能,您可以从程序中派生这些功能,而不是启动DISM。