2013-04-22 159 views
0

我試圖使用Get-VM Cmdlet的從C#叫做Hyper-V主機上的特定版本。呼叫的PowerShell從C#

顯然,根據PowerShell的模塊Hyper-V必須首先導入。然而,導入失敗 - 顯然是因爲該模塊僅在PowerShell 3.0上受支持(至少這是我從this article得出的結果)。不過,System.Management.Automation使用的PowerShell似乎是2.0版本。

InitialSessionState iss = InitialSessionState.CreateDefault(); 
iss.ImportPSModule(new string[] { "Hyper-V" }); 
Runspace runSpace = RunspaceFactory.CreateRunspace(iss); 
runSpace.Open(); 
foreach (var err in (ArrayList)runSpace 
     .SessionStateProxy.PSVariable.GetValue("Error")) 
    Console.WriteLine(err.ToString()); 
runSpace.Close(); 

回報

的 'C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \模塊\的Hyper-V \超V.psd1' 模塊不能因爲它的進口艙單包含無效的一個或多個成員 。有效的清單成員是('ModuleToProcess',...)。 刪除無效的成員('HelpInfoUri'), 然後嘗試再次導入模塊。

有沒有辦法在C#中使用特定版本的PowerShell?

回答

3

一位同事想通了:

顯然,.NET 4+配備了一個全新的公共語言運行庫:在CLR4
此運行時使用從位於C:\Windows\Microsoft.NET\assembly一個新的程序集緩存加載自己的組件。

System.Management.Automation version 3.0.0.0,它會自動使用PowerShell 3.0,存在僅CLR4。因爲我將應用程序配置爲在.NET 3.5下運行,所以它會使用舊的CLR2,甚至無法看到較新的程序集。

爲了確保應用程序仍然會在.NET 3.5上運行,這在項目文件夾添加到App.config文件:

<supportedRuntime version="v4.0"/> 
<supportedRuntime version="v2.0.50727"/> 


如果CLR4是可用的,它會載入根據GAC,找到一個策略文件,將所有對System.Management.Automation version 1.0.0.0的引用重定向到version 3.0.0.0,並且PowerShell模塊按預期工作。
如果您只有.NET 3.5,則會加載舊版本; PowerShell仍然有效,但只能使用2.0版本。

1

你有沒有看這個了嗎?

http://code.msdn.microsoft.com/windowsdesktop/Windows-PowerShell-30-SDK-9a34641d

你可能只是需要新的SDK調用Powershell的3即使安裝PSv3您的系統上了,但我通常只是一條直線Powershell的傢伙。

+0

這可能會工作,但我需要我的應用程序在.NET 3.5,以及運行 - 我不能參照3.0.0.0裝配直接,因爲它是.NET 4+ 不過+1了一絲正確的方向,謝謝 – 2013-04-23 09:45:19