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에 대해서 알아봤는데요
자세하게 사용하다보면 알것같으면서도 어려워서 포스팅을 하면서 되었던것만 해봤는데
안된다면 댓글 달아주시면 저도 다시 한번 실행 해보고 다시 포스팅하도록 하겠습니다.!
감사합니다~
'3.2 .net > C#' 카테고리의 다른 글
[C#] Linq (Language Integrated Query) (0) | 2024.10.22 |
---|---|
[C#] using에 대해서 (0) | 2024.10.21 |
[C#] 두개의 Switch (스위치문, 스위치식) (0) | 2024.10.21 |
[C#] C#이벤트종류 (제가보려고 정리) (0) | 2024.10.08 |
[.net /C#] 대리자(delegate) (0) | 2024.09.19 |
댓글