9

要在Windows 2008 R2服務器(64位)中啓用Microsoft-Hyper-V和Microsoft-Hyper-V-Management,我將調用dism.exe作爲一個進程。我用的命令是從System.Diagnostics.Process中調用dism.exe失敗

Dism.exe /在線/ GET-FeatureInfo /FeatureName:微軟的Hyper-V

Dism.exe /在線/ GET-FeatureInfo /FeatureName:Microsoft- Hyper-V-Management-客戶端

這個工作正常,當我從命令行執行它,但它嘗試通過我的代碼執行它時失敗。我試過C:\ Windows \ SysWoW64文件夾下的64位版本的Dism.exe,但它也失敗了。以下是錯誤消息我得到的,

您不能服務正在運行的64位 操作系統DISM的32位版本 。請使用與您的 計算機架構相對應的 DISM版本。

我在這裏錯過了什麼?

更新:SLaks是正確的,但問題原來是MS Visual Studio Express版本默認目標x86,我必須在.csproj文件中手動編輯到AnyCPU才能使其工作。

+1

'SysWoW64'包含32位存根,而不是64位可執行文件。 – SLaks 2011-05-09 12:14:44

回答

24

因爲你在一個32位進程中運行,你getting redirected to the 32-bit version in SysWoW64

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

+0

嘗試過但仍面臨同樣的問題,但沒有運氣! 以下是日誌中的兩行: _DISM.EXE:執行命令行:C:\ Windows \ SysWow64 \ dism.exe/online/Get-FeatureInfo/FeatureName:Microsoft-Hyper-V_DIRF Provider Store:PID = 892從位置C:\ Windows \ System32 \ Dism \ FolderProvider加載提供程序。DLL - CDISMProviderStore :: Internal_GetProvider_ 雖然我已經瞄準了它的64位版本,它仍然查找32位進程的dism庫 – 2011-05-09 12:27:59

+1

這似乎並不適用於我。在我的服務器(相同的操作系統,也是64位)中根本沒有C:\ Windows \ SysNative文件夾... – 2013-03-07 18:19:45

+1

C:\ Windows \ SysNative文件夾僅對32位進程可見。 – dabide 2014-05-26 13:21:10

4

下面創建一個批處理文件中的內容,例如RunDism.bat

%WINDIR%\SysNative\dism.exe 

調用程序中的批處理文件。 SysNative不是真正的文件夾,因此您不能直接在程序中調用上述代碼,它必須由系統調用。這種方式適用於我。

+0

我現在在Mac上開發,所以無法驗證這一點,但可能對面臨此問題的其他人有用。謝謝 – 2013-10-19 03:42:57

2

事情是你需要調用適當的dism.exe取決於系統架構。

作爲@eric許說,你需要解決的路徑,因爲它不是一個真正的路徑。以下是適合我的代碼。它基本上檢測系統體系結構,根據體系結構解析路徑,然後調用相應的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

0

我如果我添加%WINDIR%\它會失敗,我使用的是服務器2012R2 VS2017安裝使用 「SysNative \ dism.exe」 。 Tnhx!