P/Invoke란?
C# / ,NET에서 Native DLL (Unmanaged DLL)에 있는 함수를 호출하는 것을 Plaform Invoke 혹은 줄여서 P/Invoke라고 부른다. 예를 들어, C#에서 윈도우즈 운영체제의 Win32 API를 호출한다던가, C/C++로 작성된 Native DLL의 함수를 호출할 필요가 있을때, P/Invoke 방식을 사용한다.
P/Invoke를 사용하기 위해서는
- System.Runtime.InteropServices 네임스페이스에 있는 DllImport를 사용하여 어떤 DLL에서 함수를 가져올지를 지정한다.
- 해당 함수의 원형을 C# 메서드 원형으로 정의해 준다.
- 이때 C# 메서드는 static extern으로 지정한다.
예제 코드
using System;
using System.Runtime.InteropServices; // for DllImport
namespace PInvokeTest
{
class Program
{
static void Main(string[] args)
{
Beep(100, 1000);
Beep(200, 1000);
Beep(300, 1000);
Console.ReadKey();
}
[DllImport("Kernel32.dll")]
public static extern bool Beep(uint frequency, uint duration);
}
}
C#에서 C/C++ 함수를 호출하는 방법
C#에서 Win32 API를 호출하는 방법과 비슷하게, 자신이 만든(혹은 3rd Party) C/C++ Native DLL안의 함수를 호출할 수 있다.
- C/C++ 코드에서 extern C 블록을 작성해서 외부에서 사용이 가능하도록 선언해야한다.
- 다음 C# 프로젝트에서 C/C++ DLL을 복사한 후, DllImport를 정의하여 사용한다.
(통상적으로 C/C++ DLL은 C# 실행파일과 같은 폴더에 두어야 한다.)
// C++ 코드 (MyLib.dll)
#include "stdafx.h"
extern "C" {
__declspec(dllexport) float WINAPI ConvertFahrenheitToCelsius(float f);
}
float WINAPI ConvertFahrenheitToCelsius(float f)
{
float c = (f - 32) * 5.0 / 9.0;
return c;
}
// C# 코드
using System;
using System.Runtime.InteropServices;
namespace UsePInvoke
{
class Program
{
static void Main(string[] args)
{
float f = 82.50F;
float c = ConvertFahrenheitToCelsius(f);
Console.WriteLine("{0} C", c);
}
[DllImport("MyLib.dll")]
public static extern float ConvertFahrenheitToCelsius(float f);
}
}
보통 해당 기능은 외부의 3rd Party DLL을 가져다 쓸때 사용한다. 최근에 배틀아이를 연동하면서 해당 기능의 존재에 대해서 처음으로 알았다. 그 당시 전혀 모르는 상태여서 당황했던 기억이 있다. 까먹지 않도록 정리해서 리마인드 하도록 하자.
'프로그래밍 > C#' 카테고리의 다른 글
C# 컬렉션 - System.Collections.Hashtable (10) | 2023.05.23 |
---|---|
C# 컬렉션 - System.Collections.ArrayList (4) | 2023.05.22 |
C# 단정밀도(Single Precision), 배정밀도(Double Precision)에 대해서 (7) | 2023.05.11 |
C# ProtectedSessionStorage 클래스 (4) | 2023.05.10 |
C# 히트맵(HeatMap) 그리기 (4) | 2023.05.08 |
댓글