Вызов dism.exe из System.Diagnostics.Process не работает - PullRequest
10 голосов
/ 09 мая 2011

Для включения Microsoft-Hyper-V и Microsoft-Hyper-V-Management в Windows 2008 R2 Server (64bit) я вызываю dism.exe как процесс. Я использовал команду

Dism.exe / online / Get-FeatureInfo / FeatureName: Microsoft-Hyper-V

Dism.exe / онлайн / Get-FeatureInfo / FeatureName: Microsoft-Hyper-V-Management-клиенты

Это прекрасно работает, когда я выполняю это из командной строки, но не получается, когда я пытаюсь выполнить это через мой код. Я попробовал 64-битную версию Dism.exe в папке C: \ Windows \ SysWoW64, но она тоже не удалась. Вот сообщение об ошибке, которое я получаю,

Вы не можете обслуживать работающую 64-битную версию операционная система с 32-битной версией DISM. Пожалуйста, используйте версию DISM, который соответствует вашему архитектура компьютера.

Что мне здесь не хватает?

ОБНОВЛЕНИЕ: SLaks был прав, но проблема оказалась в том, что MS Visual Studio Express Edition по умолчанию нацелен на x86, который мне пришлось вручную отредактировать в файле .csproj на AnyCPU, чтобы он работал.

Ответы [ 4 ]

25 голосов
/ 09 мая 2011

Поскольку вы работаете в 32-битном процессе, вы перенаправляетесь на 32-битную версию в SysWoW64

Запустите %WINDIR%\SysNative\dism.exe, чтобы предотвратить перенаправление.

4 голосов
/ 18 октября 2013

Создайте содержимое ниже в пакетном файле, например, RunDism.bat

%WINDIR%\SysNative\dism.exe

Вызовите пакетный файл в своей программе.SysNative не является реальной папкой, поэтому вы не можете вызвать вышеуказанный код в своей программе напрямую, он должен вызываться системой.Этот способ работает для меня.

2 голосов
/ 21 марта 2016

Дело в том, что вам нужно вызвать соответствующий dism.exe в зависимости от архитектуры системы.

Как сказал @eric xu, вам нужно разрешить путь, потому что это не настоящий путь. Ниже приведен код, который работает для меня. Он в основном определяет архитектуру системы, разрешает путь в зависимости от архитектуры и затем вызывает соответствующий dism.exe.

string system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32", "dism.exe");
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
    // For 32-bit processes on 64-bit systems, %windir%\system32 folder
    // can only be accessed by specifying %windir%\sysnative folder.
    system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative", "dism.exe");
}

Источник: Перенаправитель файловой системы

0 голосов
/ 28 августа 2017

Мне пришлось использовать «SysNative \ dism.exe». Если я добавлю% WINDIR% \, это не получится, я использую VS2017 для установки на Server 2012R2.Tnhx!

...