본문 바로가기
3.2 .net/C#

[C#]외부 DLL을 사용하는 DLLImport

by Dohi._. 2025. 1. 3.
728x90

C#에서 외부 DLL(네이티브 라이브러리)을 사용하기 위해

System.Runtime.InteropServices 네임스페이스의 DllImport을 이용합니다

 

이를 이용해서 C#에서 C/C++로 작성된 네이티브 함수를 호출을 할 수 있습니다!

 

using System.Runtime.InteropServices;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
        

//사용
SendMessage(HwndSource.Handle, WM_SYSCOMMAND, (IntPtr)(61440 + Direction), IntPtr.Zero);

 

해당 코드를 보면 user32.dll에 있는 SendMessage를 가져옵니다.

 

SendMessage 함수는 user32.dll에서 정의되어 있는 외부 함수이기에

extern을 사용하여 이 함수가 C# 코드 외부에서 정의되어 있음을 명시적으로 나타냅니다.

 

만약 extern을 사용하지 않으면 C# 컴파일러는 해당 함수가 어디에 정의되어 있는지 알 수 없으므로 오류가 발생합니다.

외부에 정의된 함수라는 것을 알지 못하기 때문입니다.

 

 

자 그럼 DLL은 어디에 있어야할까요 

다양한 경로지정 방법이 있지만 

해당 포스팅에서는 3가지만 다루도록 하겠습니다.

  • 기본 경로
  • 절대 경로
  • 상대 경로

기본경로는 위의 예시처럼 DLL만 있어 경로가 명시적으로 되어있지 않을 경우 기본 경로(System32, SysWow64, PATH 등)에서 운영체제가 자동으로 찾습니다.

예를 들어 System32는 32비트 시스템에서는 32비트 DLL 파일이 C:\Windows\System32에 위치하고, 64비트 시스템에서는 64비트 DLL 파일이 C:\Windows\System32에 위치하고 있습니다.

 

절대경로는 DLL 파일의 경로를 명시적으로 지정하여 사용할 수 있습니다.

[DllImport(@"C:\파일장소\example.dll", CharSet = CharSet.Auto)]

 

상대경로는 실행 파일이 있는 디렉토리와 동일한 디렉토리에 DLL 파일을 두고 상대 경로를 지정할 수도 있습니다. 이 방법은 실행 파일과 DLL이 동일한 위치에 있을 때 유용합니다.

아래의 경우 exe파일이 있는 폴더에서 dll 폴더에 있는 ex.dll을 호출합니다.

[DllImport(@"dll\ex.dll", CharSet = CharSet.Auto)]

 

 

한번 DLLImport에 대해서 알아봤는데요

자세하게 사용하다보면 알것같으면서도 어려워서 포스팅을 하면서 되었던것만 해봤는데

안된다면 댓글 달아주시면 저도 다시 한번 실행 해보고 다시 포스팅하도록 하겠습니다.!

 

감사합니다~

728x90

댓글