从System.Diagnostics.Process调用dism.exe失败

为了在Windows 2008 R2 Server(64位)中启用Microsoft-Hyper-V和Microsoft-Hyper-V-Management,我将dism.exe称为进程。 我用过的命令是

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

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

当我从命令行执行此操作时,这可以正常工作,但当我尝试通过我的代码执行它时,它会失败。 我在C:\ Windows \ SysWoW64文件夹下尝试过64位版本的Dism.exe,但它也失败了。 这是我收到的错误消息,

您无法使用32位版本的DISM为正在运行的64位操作系统提供服务。 请使用与您的计算机体系结构相对应的DISM版本。

我在这里想念的是什么?

更新:SLaks是正确的,但问题是默认情况下MS Visual Studio Express版本的目标是x86,我必须在.csproj文件中手动编辑到AnyCPU以使其工作。

因为您在32位进程中运行,所以您将被重定向到SysWoW64的32位版本

运行%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%\它会失败,我在服务器2012R2上使用VS2017安装。 Tnhx!