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

时间:2015-05-15 13:54:49

标签: c# .net dism

情况

我正在尝试以编程方式运行命令行工具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为目标,但启动一个流程,该流程将针对其所在机器的正确平台。

2 个答案:

答案 0 :(得分:4)

  

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

但你不是。这才是重点。 The file system redirector位于32位进程中,因此当您从System32进程请求x86时,实际上是从SysWow64获取该文件。如果要访问64位exe,则需要通过%windir%\sysnative

进行请求

%windir%SpecialFolder.Windows

答案 1 :(得分:2)

虽然它没有回答关于从32位启动64位进程的问题,但是解决基本问题的另一种方法是查询WMI以获取所需的信息。您可以list optional features或列出Server Features

This answer提供了有关从C#执行WMI查询的一般信息。

你也可以check and install windows features from powershell,你可以从你的程序中产生,而不是启动DISM。