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 プラットフォーム用にコンパイルするように設定されています。(たとえば、この質問を参照してください。ただし、これについて言及している回答はありません)。ただし、残念ながら、現時点ではこのプラットフォームをターゲットにし続ける必要があるため、任意の CPU に切り替えることでこれを修正することはできません。

したがって、私の質問は、親のプラットフォームに依存しない方法でプロセスをプログラムで生成する方法です。つまり、プロジェクトを x86 を対象にしたままにし、マシンの正しいプラットフォームを対象とするプロセスを開始します。

4

2 に答える 2

4

System32 で正しい DSIM.exe を実行しているにもかかわらず、

しかし、あなたはそうではありません。それがポイントです。ファイル システム リダイレクタは 32 ビット プロセスにあるためSystem32、プロセスから要求するとx86、実際には からファイルを取得します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 に答える