Windows 앱에 대한 interop 접근 방식 선택

Windows 데스크톱 앱(WinUI 3, WPF, WinForms, 콘솔)은 관리되는 프레임워크 외부에서 API를 호출해야 하는 경우가 있습니다. 이 페이지는 이러한 경우를 이해하고 올바른 기술을 선택하는 데 도움이 됩니다.

두 개의 API 표면, 두 개의 interop 패턴

Windows 두 가지 주요 API 표면을 통해 기능을 노출합니다.

  • Win32 API - 시스템 DLL(user32.dll, kernel32.dllshell32.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 SetWindowPosHWND_TOPMOST
WinUI 3에서 파일 선택기 또는 공유 대화 상자 표시 WinRT(HWND 필요) FileOpenPickerInitializeWithWindow
시스템 메모리 또는 성능 카운터 읽기 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 앱

빠른 순서도

  1. API가 Windows.* WinRT 네임스페이스에 속해 있습니까?

  2. Win32/네이티브 API(Windows SDK 헤더에 정의됨)인가요?

    • 예 → CsWin32 를 사용하여 형식이 안전한 P/Invoke 바인딩을 생성합니다.
    • 아니요 → COM 인터페이스 또는 타사 네이티브 라이브러리일 수 있습니다. 일반적인 P/Invoke 지침은 네이티브 코드와의 .NET interop를 참조하세요.