Windows 데스크톱 앱(WinUI 3, WPF, WinForms, 콘솔)은 관리되는 프레임워크 외부에서 API를 호출해야 하는 경우가 있습니다. 이 페이지는 이러한 경우를 이해하고 올바른 기술을 선택하는 데 도움이 됩니다.
두 개의 API 표면, 두 개의 interop 패턴
Windows 두 가지 주요 API 표면을 통해 기능을 노출합니다.
Win32 API - 시스템 DLL(
user32.dll,kernel32.dll등shell32.dll)에서 내보낸 클래식 C 스타일 함수입니다. 창 관리, 파일 I/O, 프로세스 제어 및 하드웨어 액세스와 같은 하위 수준 작업을 다룹니다. Windows 이전 버전부터 존재해왔으며 관리되는 기능이 없는 많은 OS 기능에 액세스할 수 있습니다.winRT(Windows 런타임) API - Windows 8 도입된 최신 개체 지향 API 표면(네임스페이스 시작
Windows.*)입니다. WinRT API는 알림, 미디어 캡처, Bluetooth, 지리적 위치 등과 같은 영역을 다룹니다. 대부분의 WinRT API는 특별한 노력 없이 .NET 직접 액세스할 수 있지만 일부는 데스크톱 앱에 제한이 있거나 HWND(창 핸들)가 작동해야 합니다.
interop이 발생하는 경우
일반적으로 앱 프레임워크가 특정 OS 기능을 직접 노출하지 않는 경우 interop이 필요합니다. 일반적인 시나리오는 다음과 같습니다.
| 시나리오 | 어떤 API 표면 | Example |
|---|---|---|
| 제목 표시줄 또는 창 배치 사용자 지정 | Win32 |
SetWindowPos, DwmExtendFrameIntoClientArea |
| 창을 "항상 위쪽"으로 설정하거나 Z 순서를 제어합니다. | Win32 |
SetWindowPos와 HWND_TOPMOST |
| WinUI 3에서 파일 선택기 또는 공유 대화 상자 표시 | WinRT(HWND 필요) |
FileOpenPicker와 InitializeWithWindow |
| 시스템 메모리 또는 성능 카운터 읽기 | Win32 |
GlobalMemoryStatusEx, QueryPerformanceCounter |
| 전역 바로 가기 키 등록 | Win32 | RegisterHotKey |
| 토스트 알림 보내기 (패키지되지 않은 앱) | WinRT(앱 SDK 사용) | AppNotificationManager |
이러한 모든 경우에 일반 C# 코드를 작성하지만 interop 계층을 통해 Windows 호출합니다. 아래 항목에서는 각 방법을 안내합니다.
의사 결정 가이드
| …해야 합니다. | 권장되는 접근 방식 | 주제 |
|---|---|---|
| C에서 Win32 API(user32, kernel32, shell32 등)를 호출합니다.# | CsWin32 원본 생성기 사용 - 형식 안전, 손으로 쓴 서명 없음 | C#에서 Win32 API 호출(CsWin32) |
| 창 핸들을 사용하여 WinRT 개체 초기화 (선택기, 대화 상자, 공유 UI) | .NET WinRT COM interop 클래스(InitializeWithWindowWindowNative등)를 사용합니다. |
.NET 앱에서 interop API 호출 |
| WinRT API가 데스크톱(비 UWP) 앱에서 작동하는지 확인 | 제한 사항 및 대체 목록 참조 | 데스크톱 앱에서 지원되지 않는 WinRT API |
| Win32 호출을 사용하여 창을 사용자 지정하는 전체 WinUI 3 예제를 참조하세요. | 엔드투엔드 안내를 따라 해보세요 | 연습 가이드: Win32 interop을 사용하는 WinUI 3 앱 |
빠른 순서도
API가
Windows.*WinRT 네임스페이스에 속해 있습니까?- 예 → 제한 사항은 데스크톱 앱에서 지원되지 않는 WinRT API에서 확인하세요. API에 창 핸들이 필요한 경우 .NET 앱에서 interop API 호출을 참조하세요.
- → 2단계를 계속하지 않습니다.
Win32/네이티브 API(Windows SDK 헤더에 정의됨)인가요?
- 예 → CsWin32 를 사용하여 형식이 안전한 P/Invoke 바인딩을 생성합니다.
- 아니요 → COM 인터페이스 또는 타사 네이티브 라이브러리일 수 있습니다. 일반적인 P/Invoke 지침은 네이티브 코드와의 .NET interop를 참조하세요.
관련 항목
Windows developer