C++ から PowerShell を C++/CLI DLL 経由で実行する手順

🎯 C++ から PowerShell を C++/CLI DLL 経由で実行する手順(Visual Studio 2022 / C++)

✅ 全体構成

🔹 ① CLI ラッパー DLL(C++/CLI)

PowerShell スクリプトを実行する機能を提供。

🔹 ② ネイティブ C++ 呼び出し側

CLI DLL を呼び出して PowerShell スクリプトを実行。


🔧 ステップ 1: CLI ラッパー DLL プロジェクトの作成

1. プロジェクト作成

  • [新規作成] → [C++] → CLR クラスライブラリ (.NET Framework)
  • 名前:PowerShellWrapper

💡 このテンプレートが表示されない場合、「.NET デスクトップ開発」ワークロードをインストール。


2. NuGet パッケージ追加

  1. プロジェクト右クリック → [NuGet パッケージの管理]
  2. System.Management.Automation を検索・インストール
    (バージョン 5.x または 7.x)

3. CLI 側コード実装

PowerShellWrapper.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#pragma once

using namespace System;

namespace PowerShellWrapper {
    public ref class PowerShellExecutor {
    public:
        String^ Execute(String^ script);
    };
}

PowerShellWrapper.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include "PowerShellWrapper.h"
using namespace System;
using namespace System::Management::Automation;
using namespace System::Collections::ObjectModel;

String^ PowerShellWrapper::PowerShellExecutor::Execute(String^ script)
{
    PowerShell^ ps = PowerShell::Create();
    ps->AddScript(script);
    Collection<PSObject^>^ results = ps->Invoke();

    System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder();
    for each (PSObject^ result in results)
    {
        sb->AppendLine(result->ToString());
    }

    return sb->ToString();
}

🔧 ステップ 2: ネイティブ C++ 側から呼び出し

1. C++ コンソールアプリプロジェクト作成

  • 名前:NativeApp

2. 参照設定

  • プロジェクト右クリック → [参照の追加] → [プロジェクト] → PowerShellWrapper を追加
  • [構成プロパティ] → [C/C++] → [共通言語ランタイムサポート] → /clr に変更

3. 実行コード(main.cpp)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#using <System.dll>
#using "..\\PowerShellWrapper\\Debug\\PowerShellWrapper.dll"

using namespace System;
using namespace PowerShellWrapper;

int main()
{
    PowerShellExecutor^ executor = gcnew PowerShellExecutor();
    String^ result = executor->Execute("Get-Process | Select-Object -First 1");
    Console::WriteLine(result);
    return 0;
}

💡 補足(IDL / TLB / COM 登録)

  • この構成は COM ではなく .NET DLL を直接参照する方式のため、IDL や TLB、COM 登録は不要です。

✅ 最終構成

1
2
3
4
5
Solution
├── PowerShellWrapper (C++/CLI DLL)
│   └── PowerShellExecutor
├── NativeApp (C++ EXE)
    └── main.cpp → DLL呼び出し

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。