我正在尝试使用Get-VM
从 Hyper-V 主机上的 C# 调用 Cmdlet。
显然,相应的PowerShell模块Hyper-V
必须先导入。然而,导入失败 - 显然是因为该模块仅在 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();
returns
这
'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Hyper-V\Hyper-V.psd1'
无法导入模块,因为其清单包含一个或多个成员
那些无效。有效的清单成员是 ('ModuleToProcess', ...)。
删除无效的成员('HelpInfoUri'),
然后尝试再次导入该模块。
有没有办法在 C# 中使用特定版本的 PowerShell?
一位同事弄清楚了:
显然,.NET 4+ 附带了一个全新的公共语言运行时:CLR4
该运行时使用从位于以下位置的新程序集缓存加载的自己的程序集C:\Windows\Microsoft.NET\assembly
.
The 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
to version 3.0.0.0
并且 PowerShell 模块按预期工作。
如果您只有.NET 3.5,则会加载旧版本; PowerShell 仍然可以使用,但最高版本仅为 2.0。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)