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);
이유는 모르겠지만, 이렇게 하면 된다. (구글링)
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
/SAFESEH (이미지에는 안전한 예외 처리기가 있습니다.) (0) | 2022.10.12 |
---|---|
[C++] List 에서 pair로 된 데이터 찾기 (0) | 2022.09.21 |
[C++] C#에서 사용할 수 있게 Lib 만들기 (CLR Class) (0) | 2022.09.15 |
[C++] 소문자/대문자 변환 (tolower, toupper) (0) | 2022.08.23 |
[C++] wifstream/wofstream 한글 인식 문제 (0) | 2022.08.18 |