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

时间:2011-05-09 12:13:27

标签: c# visual-studio windows-server-2008-r2 system.diagnostics

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

  

Dism.exe / online / Get-FeatureInfo   / FeatureName:微软的Hyper-V

     

Dism.exe / online / Get-FeatureInfo   / FeatureName:微软的Hyper-V-管理的客户端

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

  

您无法为正在运行的64位服务   具有32位版本的操作系统   DISM。请使用版本   对应于您的DISM   计算机的架构。

我在这里缺少什么?

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

4 个答案:

答案 0 :(得分:25)

因为您使用的是32位进程,所以getting redirected to the 32-bit version in SysWoW64

运行%WINDIR%\SysNative\dism.exe以防止重定向。

答案 1 :(得分:4)

在批处理文件中创建以下内容,例如RunDism.bat

%WINDIR%\SysNative\dism.exe

在程序中调用批处理文件。 SysNative不是真正的文件夹,因此您不能直接在程序中调用上面的代码,它必须由系统调用。这种方式对我有用。

答案 2 :(得分:2)

问题是你需要根据系统架构调用适当的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");
}

来源:File System Redirector

答案 3 :(得分:0)

我不得不使用“SysNative \ dism.exe” 如果我添加%WINDIR%\它会失败,我在服务器2012R2上使用VS2017安装。 Tnhx!