【问题标题】:Programmatically start a process independent of platform以编程方式启动独立于平台的进程
【发布时间】:2015-05-15 13:54:49
【问题描述】:

情况

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

【问题讨论】:

  • 在不知道为什么不能针对任何 CPU 的情况下,这个建议可能听起来很愚蠢,但是您能否编写一个位于中间的小程序并通过针对任何 CPU 和您的主程序调用来生成 DISM.exe是吗?
  • @Crowcoder 这可能是一个选项,但我不确定这是否可行。
  • 我刚刚发现了相反的问题(出于某种原因),其中一个答案指向一个工具,通过它的声音可以让您在 64 位操作系统上运行 32 位进程。这是问题:stackoverflow.com/questions/8489871/… 这是他们建议的工具techsupportalert.com/content/…
  • 如果我的评论对您有帮助,请告诉我,我会回答。我不想把它作为答案,因为这是我第一次看到这个,所以我无法验证它是否会起作用,它只是听起来会。
  • @Keithin8a 由于我不明白的原因,DSIM.exe 对 32 位和 64 位进程非常敏感。因此,即使我在 System32(不是 SysWOW64)中运行正确的 DSIM.exe,它仍然会给我问题中的信息。除了问题中描述的我已经尝试过的内容之外,我不确定您的评论所暗示的内容。

标签: c# .net dism


【解决方案1】:

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

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

%windir%SpecialFolder.Windows

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!我会调查一下。
    • 刚试过这个,效果很好,但我对接受它有点怀疑,因为它与这个问题无关。如果我创建了一个更适用于此的新问题并且您将答案移到其他地方,您会同意吗?
    • 别管额外的问题,已经有人回答了,比如stackoverflow.com/a/7039227/163495
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2014-07-15
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多