전송용

BananaCube·2023년 3월 21일

C#을 C++에서 사용하는 예제를 만들어줘
C# 코드를 C++에서 사용하려면, C++/CLI를 사용하여 C#과 C++을 결합해야 합니다. 이를 통해 C++ 프로그램 내에서 .NET 어셈블리를 로드하고, C# 클래스와 메서드를 호출할 수 있습니다. 예를 들어, C# 라이브러리와 C++/CLI 래퍼를 만들어 사용할 수 있습니다.

먼저 간단한 C# 라이브러리를 만들어 보겠습니다. 이 라이브러리는 SimpleMath 클래스를 포함하며, 두 숫자를 더하는 메서드가 있습니다.

SimpleMath.cs:

using System;

namespace CSharpLibrary
{
    public class SimpleMath
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

이제 C++/CLI 프로젝트를 생성하여 C# 라이브러리를 참조하고, SimpleMath 클래스를 사용하는 래퍼 클래스를 만들어 보겠습니다.

CSharpWrapper.h:

#pragma once
#include <msclr\auto_gcroot.h>

using namespace System;
using namespace CSharpLibrary;

class CSharpWrapper
{
public:
    CSharpWrapper();
    ~CSharpWrapper();
    int Add(int a, int b);

private:
    msclr::auto_gcroot<SimpleMath^> m_SimpleMath;
};

CSharpWrapper.cpp:

#include "CSharpWrapper.h"

CSharpWrapper::CSharpWrapper()
{
    m_SimpleMath = gcnew SimpleMath();
}

CSharpWrapper::~CSharpWrapper()
{
}

int CSharpWrapper::Add(int a, int b)
{
    return m_SimpleMath->Add(a, b);
}

마지막으로, 이 래퍼 클래스를 사용하여 C++ 프로그램에서 C# 코드를 호출하겠습니다.

main.cpp:

#include <iostream>
#include "CSharpWrapper.h"

int main()
{
    CSharpWrapper wrapper;
    int result = wrapper.Add(3, 5);
    std::cout << "The result of 3 + 5 is: " << result << std::endl;

    return 0;
}

이 프로젝트를 빌드하고 실행하면, C++ 프로그램에서 C# 라이브러리를 호출한 결과가 출력됩니다. 다음과 같은 출력을 볼 수 있습니다.

The result of 3 + 5 is: 8

이것으로 C++ 프로그램에서 C# 코드를 사용하는 예제가 완성되었습니다. C++/CLI를 사용하면 더 복잡한 C# 클래스 및 메서드도 호출할 수 있습니다.

곽신호
COM 을 사용해서도 구현해줘

COM (Component Object Model)을 사용하여 C#과 C++ 간의 상호 운용성을 구현하려면 다음 단계를 수행해야 합니다:

C#에서 COM 인터페이스를 정의하고 구현합니다.
C# 어셈블리를 COM으로 등록합니다.
C++에서 COM 객체를 생성하고 인터페이스를 사용합니다.
예를 들어, 두 숫자를 더하는 메서드를 가진 C# COM 구성 요소를 만들어 보겠습니다.

IMathOperations.cs:

using System.Runtime.InteropServices;

namespace CSharpCOMLibrary
{
    [ComVisible(true)]
    [Guid("E8C90D2F-4A7D-4A8E-BCF5-93C47F7BDB20")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMathOperations
    {
        int Add(int a, int b);
    }
}

SimpleMath.cs:

using System;
using System.Runtime.InteropServices;

namespace CSharpCOMLibrary
{
    [ComVisible(true)]
    [Guid("22AA1DC9-87A9-42AC-8A2A-0546A0C6AA74")]
    [ClassInterface(ClassInterfaceType.None)]
    public class SimpleMath : IMathOperations
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

C# 어셈블리를 COM으로 등록하려면 먼저 AssemblyInfo.cs 파일에 다음 내용을 추가합니다.

AssemblyInfo.cs:

using System.Runtime.InteropServices;

[assembly: ComVisible(true)]
[assembly: Guid("A7E085FF-1F5A-4B6F-B5C5-5C5EFE5A71C5")]

이제 C# 어셈블리를 빌드하고 COM으로 등록합니다. 관리자 권한으로 명령 프롬프트를 열고, 다음 명령을 실행합니다.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase /tlb CSharpCOMLibrary.dll

이제 C++에서 COM 객체를 생성하고 인터페이스를 사용할 수 있습니다.

main.cpp:

#include <iostream>
#include <Windows.h>
#include <comdef.h>
#include <objbase.h>
#include <atlbase.h>

// IMathOperations interface GUID
const IID IID_IMathOperations = { 0xE8C90D2F, 0x4A7D, 0x4A8E, { 0xBC, 0xF5, 0x93, 0xC4, 0x7F, 0x7B, 0xDB, 0x20 } };

// SimpleMath class GUID
const CLSID CLSID_SimpleMath = { 0x22AA1DC9, 0x87A9, 0x42AC, { 0x8A, 0x2A, 0x05, 0x46, 0xA0, 0xC6, 0xAA, 0x74 } };

int main()
{
    CoInitialize(NULL

끊겼던 부분 이어서

main.cpp (계속):

{
    CComPtr<IMathOperations> pMathOperations;

    HRESULT hr = CoCreateInstance(CLSID_SimpleMath, NULL, CLSCTX_INPROC_SERVER, IID_IMathOperations, (void**)&pMathOperations);

    if (SUCCEEDED(hr))
    {
        int result = 0;
        hr = pMathOperations->Add(3, 5, &result);

        if (SUCCEEDED(hr))
        {
            std::cout << "The result of 3 + 5 is: " << result << std::endl;
        }
        else
        {
            std::cerr << "Failed to call Add method, HRESULT: " << std::hex << hr << std::endl;
        }
    }
    else
    {
        std::cerr << "Failed to create SimpleMath instance, HRESULT: " << std::hex << hr << std::endl;
    }

    CoUninitialize();
    return 0;
}

이제 프로젝트를 빌드하고 실행합니다. 결과는 다음과 같습니다.

The result of 3 + 5 is: 8

이렇게 COM을 사용하여 C# 코드와 C++ 코드를 상호 운용하도록 구현할 수 있습니다. C++에서 COM 객체를 생성하고 인터페이스를 통해 C# 코드를 호출하는 방식으로 동작합니다.

profile
C++ 독학한 내용을 정리하는 벨로그입니다.

0개의 댓글