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