🎯 Étapes pour exécuter PowerShell depuis C++ via une DLL C++/CLI (Visual Studio 2022 / C++)
✅ Architecture globale
🔹 ① DLL Wrapper CLI (C++/CLI)
Fournit la fonctionnalité pour exécuter des scripts PowerShell.
🔹 ② Appelant C++ Natif
Appelle la DLL CLI pour exécuter le script PowerShell.
🔧 Étape 1 : Création du projet DLL Wrapper CLI
1. Créer le projet
- [Créer un nouveau projet] → [C++] → Bibliothèque de classes CLR (.NET Framework)
- Nom :
PowerShellWrapper
💡 Si ce modèle n’est pas affiché, installez la charge de travail “Développement de bureau .NET”.
2. Ajouter le package NuGet
- Clic droit sur le projet → [Gérer les packages NuGet]
- Recherchez et installez
System.Management.Automation
(Version 5.x ou 7.x)
3. Implémentation du code côté 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();
}
|
🔧 Étape 2 : Appel depuis le C++ natif
1. Création du projet d’application console C++
2. Configuration des références
- Clic droit sur le projet → [Ajouter] → [Référence] → Projets → Ajouter
PowerShellWrapper - [Propriétés de configuration] → [C/C++] → [Prise en charge du Common Language Runtime] → Remplacer par /clr
3. Code d’exécution (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;
}
|
- Cette configuration fait directement référence à la DLL .NET plutôt qu’à COM, donc l’enregistrement IDL, TLB ou COM n’est pas nécessaire .
✅ Structure finale
1
2
3
4
5
| Solution
├── PowerShellWrapper (C++/CLI DLL)
│ └── PowerShellExecutor
├── NativeApp (C++ EXE)
└── main.cpp → Appel DLL
|