Programming/.NET

C#과 같은 닷넷언어로 만들어진 프로그램은 플렛폼의 근간을 .NET에 두고 있는데 C나 C++로 만들어진 프로그램과는 메모리 관리방법이 다릅니다. 흔히 관리코드(.NET)와 비관리코드로 나누곤 하는데, 같은 .NET세계의 프로그램은 예를 들어 VB.NET과 C#에서 만든 서로간의 프로그램은 간단히 '참조'라는 방법을 통해서 아주 쉽게 서로간의 기능을 호출하여 사용하는 것이 가능하지만 C/C++처럼 완전히 다른 체계의 프로그램이라면 얘기가 조금 달라집니다.

 

세상의 모든 프로그램을 VB.NET이나 C#과 같은 닷넷호환언어로 만들 수는 없고, 때로는 필요한 기능을 C나 C++을 이용해 라이브러리(DLL)로 만들어 C#등의 프로그램에서 이들의 기능을 호출하는 방법으로 사용해야할 경우가 있는데 대표적인게 윈도우 API를 호출하는 경우입니다.

 

[DllImport("user32.dll")]
private static extern int RegisterHotKey(int hwnd, int id, int fsModifiers, int vk);

위 예제는 extern을 사용해 user32.dll에서 RegisterHotKey메서드를 호출하기위한 선언문입니다. 자세한 내용은 아래 링크를 참고해 주세요.

 

2011/05/31 - [Programming/Windows API] - RegisterHotKey - Windows Hotkey 설정

 

사실 extern예약어는 메서드의 본체가 없어도 컴파일을 정상적으로 수행시키는 역활을 할 뿐입니다. 예제에서도 RegisterHotKey 메서드에 대한 선언만 할뿐 메서드의 본체는 따로 정의하지 않았는데 이 메서드가 어디를 통해서 호출되어야 하는가는 DllImport특성 에서 파일(user32.dll)명을 통해 지정합니다. 그러면 이 파일에 존재하는 API함수인 RegisterHotKey메서드를 호출함으로서 처리되는 것입니다.

 

위와 같이 선언하고 나면 다음의 예제처럼 메서드를 호출하여 원하는 기능을 수행할 수 있습니다.

 

RegisterHotKey((int)this.Handle, 1122, MOD_CONTROL, (int)Keys.A);

 

extern에 관해서 윈도우 API를 호출하는 것으로 예제를 설명해 드렸지만 특정한 기능을 수행하는 프로그램을 직접 C/C++을 통해 DLL로 제작하였다면 위와 똑같은 방법으로 C#에서 호출하여 사용하는 것이 가능합니다. 다만 C/C++에서 C#에서 사용가능하도록 데이터형이나 타입을 맞추어야 할것입니다.

'Programming > .NET' 카테고리의 다른 글

[C#] using static  (0) 2018.07.27
[ASP.NET MVC] 헬퍼메서드(Helper Method)  (0) 2018.07.18
[C#] extern  (0) 2018.07.03
[C#] BinaryFormatter / XmlSerializer / DataContractJsonSerializer  (0) 2018.06.26
[C#] Encoding / BitConverter  (0) 2018.06.19
[C#] fixed  (0) 2018.06.13
0 0