以编程方式启动与平台无关的进程

6

情况

我正在尝试以编程方式运行命令行工具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平台。(例如,参见this question,尽管没有答案提到这一点)。然而,不幸的是,目前要求我们继续针对此平台进行开发,我无法通过切换到任何CPU来解决这个问题。

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


@Crowcoder 这可能是一个选项,但我并不确定那会起作用。 - Ben Aaronson
由于我不明白的原因,DSIM.exe 对于32位与64位进程非常挑剔。所以即使我在System32中运行了正确的DSIM.exe(而不是SysWOW64),它仍然会给我问题中提到的那个消息。我不太确定你的评论除了我已经在问题中描述的内容之外还在暗示什么。 - Ben Aaronson
@Richard 请尝试在项目构建选项中取消选择“优先使用32位”。 - Ben Aaronson
@BenAaronson 我只能在工作中简单地浏览一下那个网页,然后认为它是一种仿真器,可以下载并运行,以允许您运行32位版本。但仔细检查后发现不是这样的。 - Keithin8a
也许值得尝试不将runas指定为动词,而是作为进程启动runas,并将dism作为参数传递给runas。 - Ralf
显示剩余3条评论
2个回答

4
即使我在System32中运行了正确的DSIM.exe,但你并没有。这就是关键。文件系统重定向欺骗32位进程,因此当你从x86进程请求System32时,你实际上会从SysWow64获取文件。如果你想访问64位exe,你需要通过%windir%\sysnative来请求它。
(%windir%SpecialFolder.Windows)

2

谢谢!我会研究一下这个。 - Ben Aaronson
刚试了一下,效果很好,但我有点不敢接受它,因为它与这个问题没有太大关系。如果我创建一个更适用于此的新问题,您是否可以将答案移动过去? - Ben Aaronson
不用担心额外的问题,已经有其他人回答了,例如https://dev59.com/1FrUa4cB1Zd3GeqPhjIh#7039227。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接