Featured image of post 'C++์—์„œ PowerShell์„ C++/CLI DLL์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•'

'C++์—์„œ PowerShell์„ C++/CLI DLL์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•'

๐ŸŽฏ C++์—์„œ PowerShell์„ C++/CLI DLL์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• (Visual Studio 2022 / C++)

โœ… ์ „์ฒด ๊ตฌ์กฐ

๐Ÿ”น โ‘  CLI ๋ž˜ํผ DLL (C++/CLI)

PowerShell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น โ‘ก ๋„ค์ดํ‹ฐ๋ธŒ C++ ํ˜ธ์ถœ์ž

CLI DLL์„ ํ˜ธ์ถœํ•˜์—ฌ PowerShell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง ๋‹จ๊ณ„ 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๋กœ ๋งŒ๋“ฆ
Jimmy์˜ Stack ํ…Œ๋งˆ ์‚ฌ์šฉ ์ค‘