Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用特定版本的PowerShell#_C#_Powershell_Hyper V_Powershell Module - Fatal编程技术网

C# 从C调用特定版本的PowerShell#

C# 从C调用特定版本的PowerShell#,c#,powershell,hyper-v,powershell-module,C#,Powershell,Hyper V,Powershell Module,我正在尝试在Hyper-V主机上使用从C#调用的Get-VMCmdlet 显然,必须首先导入相应的PowerShell模块Hyper-V。然而,导入失败-显然是因为该模块仅在PowerShell 3.0上受支持(至少我是这么认为的)。但是System.Management.Automation使用的PowerShell似乎是2.0版 InitialSessionState iss = InitialSessionState.CreateDefault(); iss.ImportPSModule(

我正在尝试在Hyper-V主机上使用从C#调用的
Get-VM
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();
返回

'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Hyper-V\Hyper-V.psd1' 无法导入模块,因为其清单包含一个或多个成员 这是无效的。有效的清单成员是('ModuleToProcess',…)。 删除无效的成员(“HelpInfoUri”), 然后再次尝试导入模块


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

您已经看过了吗


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

您看过这个了吗


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

一位同事发现了这一点:

显然,.NET4+附带了一个全新的公共语言运行库:CLR4
此运行时使用从位于
C:\Windows\Microsoft.NET\assembly
的新程序集缓存加载的自己的程序集

将自动使用PowerShell 3.0的
System.Management.Automation版本3.0.0
,仅适用于CLR4。因为我将应用程序配置为在.NET3.5下运行,所以它将使用旧的CLR2,甚至看不到新的程序集

要确保应用程序仍在.NET 3.5上运行,请将其添加到项目文件夹中的
App.config
文件中:

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


如果CLR4可用,它将加载相应的GAC,找到一个策略文件,将所有对
System.Management.Automation 1.0.0版
的引用重定向到
3.0.0.0版
,PowerShell模块将按预期工作。

如果您只有.NET 3.5,将加载旧版本;PowerShell仍然可以使用,但仅在2.0版之前可用。

一位同事发现了这一点:

显然,.NET4+附带了一个全新的公共语言运行库:CLR4
此运行时使用从位于
C:\Windows\Microsoft.NET\assembly
的新程序集缓存加载的自己的程序集

将自动使用PowerShell 3.0的
System.Management.Automation版本3.0.0
,仅适用于CLR4。因为我将应用程序配置为在.NET3.5下运行,所以它将使用旧的CLR2,甚至看不到新的程序集

要确保应用程序仍在.NET 3.5上运行,请将其添加到项目文件夹中的
App.config
文件中:

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


如果CLR4可用,它将加载相应的GAC,找到一个策略文件,将所有对
System.Management.Automation 1.0.0版
的引用重定向到
3.0.0.0版
,PowerShell模块将按预期工作。

如果您只有.NET 3.5,将加载旧版本;PowerShell仍然可以工作,但只有在2.0版之前才能工作。

这可能会工作,但我需要我的应用程序也在.NET 3.5上运行-我无法直接引用3.0.0.0程序集,因为它是.NET 4+still+1,以获得正确方向的提示,谢谢这可能会工作,但是我也需要我的应用程序在.NET3.5上运行-我不能直接引用3.0.0.0程序集,因为它是.NET4+Still+1,以获得正确方向的提示,谢谢