🎯 Pasos para ejecutar PowerShell desde C++ a través de una DLL de C++/CLI (Visual Studio 2022 / C++)
✅ Arquitectura general
🔹 ① DLL envoltura CLI (C++/CLI)
Proporciona la funcionalidad para ejecutar scripts de PowerShell.
🔹 ② Lado de llamada C++ nativo
Llama a la DLL CLI para ejecutar el script de PowerShell.
🔧 Paso 1: Creación del proyecto de la DLL envoltura CLI
1. Creación del proyecto
- [Crear un proyecto nuevo] → [C++] → Biblioteca de clases CLR (.NET Framework)
- Nombre:
PowerShellWrapper
💡 Si no ves esta plantilla, instala la carga de trabajo “Desarrollo de escritorio de .NET”.
2. Añadir paquete NuGet
- Haz clic derecho en el proyecto → [Administrar paquetes NuGet]
- Busca e instala
System.Management.Automation
(Versión 5.x o 7.x)
3. Implementación del código en el lado 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();
}
|
🔧 Paso 2: Llamada desde el lado de C++ nativo
1. Crear proyecto de aplicación de consola C++
2. Configurar referencias
- Haz clic derecho en el proyecto → [Agregar] → [Referencia] → [Proyectos] → Agrega
PowerShellWrapper - [Propiedades de configuración] → [C/C++] → [Soporte de Common Language Runtime] → Cambiar a /clr
3. Código de ejecución (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;
}
|
💡 Nota adicional (IDL / TLB / Registro COM)
- Esta configuración hace referencia directa a una DLL de .NET en lugar de COM, por lo tanto, no se requiere IDL, TLB ni registro COM.
✅ Estructura final
1
2
3
4
5
| Solution
├── PowerShellWrapper (DLL C++/CLI)
│ └── PowerShellExecutor
├── NativeApp (EXE C++)
└── main.cpp → Llamada a la DLL
|