Вызов dism.exe из System.Diagnostics.Process не работает

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

Dism.exe / онлайн / Получить-FeatureInfo / Имя-функции: 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 ответа

Решение

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

Бежать %WINDIR%\SysNative\dism.exe предотвратить перенаправление.

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

%WINDIR%\SysNative\dism.exe

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

Дело в том, что вам нужно позвонить соответствующему 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");
}

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

Я должен был использовать "SysNative\dism.exe". Если я добавлю%WINDIR%\, то произойдет сбой, я использую VS2017 для установки на Server 2012R2. Tnhx!

Другие вопросы по тегам