Вызов 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!