ЁЯОп C++ рд╕реЗ C++/CLI DLL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PowerShell рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг (Visual Studio 2022 / C++)
тЬЕ рд╕рдордЧреНрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
ЁЯФ╣ тСа CLI рд░реИрдкрд░ DLL (C++/CLI)
PowerShell рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
ЁЯФ╣ тСб рдиреЗрдЯрд┐рд╡ C++ рдХреЙрд▓рд░
PowerShell рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП CLI DLL рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
ЁЯФз рдЪрд░рдг 1: CLI рд░реИрдкрд░ DLL рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
1. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
- [рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ] тЖТ [C++] тЖТ CLR рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (.NET Framework)
- рдирд╛рдо:
PowerShellWrapper
ЁЯТб рдпрджрд┐ рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ “.NET рдбреЗрд╕реНрдХрдЯреЙрдк рд╡рд┐рдХрд╛рд╕” рд╡рд░реНрдХрд▓реЛрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
2. NuGet рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВ
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ тЖТ [NuGet рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ]
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++ рдХрдВрд╕реЛрд▓ рдРрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
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;
}
|
- рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди COM рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ .NET DLL рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП IDL, TLB, рдпрд╛ COM рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред
тЬЕ рдЕрдВрддрд┐рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
1
2
3
4
5
| Solution
тФЬтФАтФА PowerShellWrapper (C++/CLI DLL)
тФВ тФФтФАтФА PowerShellExecutor
тФЬтФАтФА NativeApp (C++ EXE)
тФФтФАтФА main.cpp тЖТ DLL рдХреЙрд▓
|