0

Get-VMHyper-V ホストで C# から呼び出されたコマンドレットを使用しようとしています。

明らかに、対応する 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' モジュールは、そのマニフェストに無効なメンバーが 1 つ以上含まれているため、インポートできません。有効なマニフェスト メンバーは ('ModuleToProcess', ...) です。無効なメンバー ('HelpInfoUri') を削除してから、モジュールのインポートを再試行してください。

C# で特定のバージョンの PowerShell を使用する方法はありますか?

4

2 に答える 2

3

同僚はそれを理解しました:

明らかに、.NET 4+ にはまったく新しい共通言語ランタイムが付属しています: CLR4
このランタイムは、.NET にある新しいアセンブリ キャッシュから読み込まれた独自のアセンブリを使用しますC:\Windows\Microsoft.NET\assembly

PowerShell 3.0 を自動的に使用するはSystem.Management.Automation version 3.0.0.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.0version 3.0.0.0、PowerShell モジュールが期待どおりに機能します。
.NET 3.5 しかない場合は、古いバージョンが読み込まれます。PowerShell は引き続き機能しますが、バージョン 2.0 までしか機能しません。

于 2013-04-23T09:43:45.113 に答える