0

我正在尝试Get-VM在 Hyper-V 主机上使用从 C# 调用的 Cmdlet。

Hyper-V显然,必须先导入相应的 PowerShell 模块。但是,导入失败 - 显然是因为该模块仅在 PowerShell 3.0 上受支持(至少这是我从本文中得出的结论)。不过,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\Modules\Hyper-V\Hyper-V.psd1”模块,因为其清单包含一个或多个无效成员。有效的清单成员是 ('ModuleToProcess', ...)。删除无效的成员('HelpInfoUri'),然后再次尝试导入模块。

有没有办法在 C# 中使用特定版本的 PowerShell?

4

2 回答 2

3

一位同事想通了:

显然,.NET 4+ 带有一个全新的公共语言运行时:CLR4
此运行时使用从位于 .NET 的新程序集缓存加载的自己的程序集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.0PowerShell 模块按预期工作。
如果您只有 .NET 3.5,则将加载旧版本;PowerShell 仍然有效,但仅支持 2.0 版。

于 2013-04-23T09:43:45.113 回答
1

你看过这个了吗?

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

即使您的系统上已经安装了 PSv3,您也可能只需要新的 SDK 来调用 Powershell 3,但我通常只是一个直接的 Powershell 人。

于 2013-04-22T14:12:13.083 回答