问题
For enabling Microsoft-Hyper-V and Microsoft-Hyper-V-Management in Windows 2008 R2 Server(64bit), I'm calling dism.exe as a process. The command I've used is
Dism.exe /online /Get-FeatureInfo /FeatureName:Microsoft-Hyper-V
Dism.exe /online /Get-FeatureInfo /FeatureName:Microsoft-Hyper-V-Management-Clients
This works fine when I execute this from the command line but it fails when I try to execute it through my code. I've tried the 64bit version of Dism.exe under the C:\Windows\SysWoW64 folder but it fails too. Here is the error message I get,
You cannot service a running 64-bit operating system with a 32-bit version of DISM. Please use the version of DISM that corresponds to your computer's architecture.
What am I missing here?
UPDATE: SLaks was right, but the issue turned out to be that MS Visual studio express edition by default targets x86 which I had to manually edit in the .csproj file to AnyCPU to make it work.
回答1:
Because you're running in a 32-bit process, you're getting redirected to the 32-bit version in SysWoW64
Run %WINDIR%\SysNative\dism.exe
to prevent redirection.
回答2:
Create below content in a batch file, for example RunDism.bat
%WINDIR%\SysNative\dism.exe
Call the batch file in your program. SysNative is not a real folder, so you cannot call above code in your program directly, it must be call by system. This way is worked for me.
回答3:
The thing is you need to call the appropriate dism.exe
dependng on the system architecture.
As @eric xu said, you need to resolve the path because it is not a real path. Below is the code that works for me. It basically detects the system architecture, resolves the path depending on the architecture and then calls the appropriate 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");
}
Source: File System Redirector
回答4:
I had to use "SysNative\dism.exe" If I added %WINDIR%\ it would fail, I'm using VS2017 installing on Server 2012R2. Tnhx!
来源:https://stackoverflow.com/questions/5936719/calling-dism-exe-from-system-diagnostics-process-fails