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,但启动一个进程,该进程将针对它所在的机器的正确平台。

4

2 回答 2

4

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

但你不是。这才是重点。文件系统重定向器依赖于 32 位进程,因此当您System32x86进程请求时,您实际上是从SysWow64. 如果要访问 64 位 exe,需要通过%windir%\sysnative

%windir%存在SpecialFolder.Windows

于 2015-05-15T14:23:44.687 回答
2

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

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

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

于 2015-05-15T14:17:27.370 回答