Featured image of post C++ рд╕реЗ C++/CLI DLL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PowerShell рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг

C++ рд╕реЗ C++/CLI DLL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PowerShell рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг

ЁЯОп 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 рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВ

  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 рдХреЗ рд╕рд╛рде
рдереАрдо Stack рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ Jimmy