🎯 Schritte zum Ausführen von PowerShell aus C++ über eine C++/CLI-DLL (Visual Studio 2022 / C++)
✅ Gesamtarchitektur
🔹 ① CLI-Wrapper-DLL (C++/CLI)
Stellt die Funktionalität zum Ausführen von PowerShell-Skripten bereit.
🔹 ② Nativer C++-Aufrufer
Ruft die CLI-DLL auf, um das PowerShell-Skript auszuführen.
🔧 Schritt 1: Erstellen des CLI-Wrapper-DLL-Projekts
1. Projekt erstellen
- [Neues Projekt erstellen] → [C++] → CLR-Klassenbibliothek (.NET Framework)
- Name:
PowerShellWrapper
💡 Wenn diese Vorlage nicht angezeigt wird, installieren Sie die Workload “.NET-Desktopentwicklung”.
2. NuGet-Paket hinzufügen
- Rechtsklick auf das Projekt → [NuGet-Pakete verwalten]
- Suchen und installieren Sie
System.Management.Automation
(Version 5.x oder 7.x)
3. Implementierung des CLI-Codes
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();
}
|
🔧 Schritt 2: Aufruf aus nativem C++
1. Erstellen des C++-Konsolen-App-Projekts
2. Referenzeinstellungen
- Rechtsklick auf das Projekt → [Hinzufügen] → [Referenz] → Projekte →
PowerShellWrapper hinzufügen - [Konfigurationseigenschaften] → [C/C++] → [Common Language Runtime-Unterstützung] → Ändern in /clr
3. Ausführungscode (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;
}
|
- Diese Konfiguration verweist direkt auf die .NET-DLL anstelle von COM, daher ist keine IDL-, TLB- oder COM-Registrierung erforderlich .
✅ Endgültige Architektur
1
2
3
4
5
| Solution
├── PowerShellWrapper (C++/CLI DLL)
│ └── PowerShellExecutor
├── NativeApp (C++ EXE)
└── main.cpp → DLL-Aufruf
|