Program Language/C & C++

[C++] C#에서 사용할 수 있게 Lib 만들기

야곰야곰+책벌레 2022. 9. 15. 09:47
728x90
반응형

C#에서 사용 가능한 C++ 라이브러리를 만들려면 우선 CLR을 사용할 수밖에 없다.

우선은 Win32 Lib를 생성해야 한다.

C#에서 사용할 수 있는 것은 Explicit Link임으로 extern "C" __declspec(dllexport)를 이용한 선언을 해줘야 한다.

extern "C" __declspec(dllexport) int add_integer(int a, int b)
{
	return a + b;
}

이제, C# 콘솔 프로젝트를 만든다.

C++프로젝트와 C# 프로젝트는 출력 폴더가 다르기 때문에, 테스트하려면 생성된 dll 파일을 옮겨줘야 한다. 

우선 번거롭지 않기 위해서 C++ 출력을 C# bin 폴더로 지정했다.

C#에서 외부 라이브러리를 가져오기 위해서 using System.Runtime.InteropServices; 를 작성해야 하며, C++에서 만들어진 타입과 동일하게 함수를 선언해야 한다. (C++의 Explicit Linking과 비슷하다고 생각하면 된다.)

using System.Runtime.InteropServices;

namespace LibUseCSharp
{
    class Program
    {
        [DllImport("CalcLib.dll")]
        public static extern int add_integer(int a, int b);

        static void Main(string[] args)
        {
            Console.WriteLine(add_integer(10, 11));
        }
    }
}

컴파일 후, 실행 하면 제대로 동작함을 알 수 있다.

이때 C#은 AnyCPU라는 빌드 옵션이 있는데, 이를 C++ 라이브러리와 맞춰야 한다.

프로젝트 속성을 열어서 Platform target을 x64로 맞춰야 한다. 그런데 32bit에서는 실행(shift + F5)을 하면 제대로 동작하지만 디버그 모드(F5)에서는 아래와 같은 에러가 발생한다.

디버그 모드에서 실행하려면 코드를 조금 수정해야 한다.

[DllImport("CalcLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int add_integer(int a, int b);

이유는 모르겠지만, 이렇게 하면 된다. (구글링)

CPlusLibCSharpUse.zip
0.02MB

728x90
반응형