Escolha a sua abordagem de interoperabilidade para aplicações Windows

As aplicações de ambiente de trabalho do Windows (WinUI 3, WPF, WinForms, consola) por vezes precisam de chamar APIs fora do seu framework gerido. Esta página ajuda-o a perceber quando isso acontece e a escolher a técnica certa.

Duas superfícies API, dois padrões de interoperabilidade

O Windows expõe funcionalidades através de duas superfícies principais de API:

  • APIs Win32 — As funções clássicas ao estilo C exportadas a partir de DLLs do sistema (user32.dll, kernel32.dll, shell32.dll, etc.). Estes abrangem operações de baixo nível como gestão de janelas, I/O de ficheiros, controlo de processos e acesso a hardware. Existem desde as primeiras versões do Windows e continuam a ser a forma de aceder a muitas funcionalidades do sistema operativo que não têm equivalente gerido.

  • APIs do Windows Runtime (WinRT) — Uma superfície moderna orientada a objetos (espaços de nomes começando por Windows.*) introduzida com o Windows 8. As APIs WinRT abrangem áreas como notificações, captura de media, Bluetooth, geolocalização e muito mais. A maioria das APIs do WinRT é acessível diretamente a partir do .NET sem esforço especial, mas algumas têm restrições em aplicações de ambiente de trabalho ou requerem um handle de janela (HWND) para funcionar.

Quando vais encontrar interoperabilidade

Normalmente precisas de interoperabilidade quando o framework da tua aplicação não expõe diretamente uma funcionalidade específica do sistema operativo. Cenários comuns incluem:

Scenario Qual superfície da API Example
Personalize a colocação da barra de título ou da janela Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Defina uma janela como "sempre em cima" ou controle a ordem Z Win32 SetWindowPos com HWND_TOPMOST
Mostrar um seletor de ficheiros ou um diálogo de partilha do WinUI 3 WinRT (precisa de HWND) FileOpenPicker com InitializeWithWindow
Leia memória do sistema ou contadores de desempenho Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Registar um atalho de teclado global Win32 RegisterHotKey
Envie uma notificação de toast (aplicação desempacotada) WinRT (com o App SDK) AppNotificationManager

Em todos estes casos, escreves código normal em C# mas ligas ao Windows através de uma camada de interoperabilidade. Os temas abaixo guiam-no em cada abordagem.

Guia de decisão

Preciso de... Abordagem recomendada Topic
Chamar uma API Win32 (user32, kernel32, shell32, etc.) a partir do C# Utilize o gerador de código CsWin32 — com segurança de tipos, sem assinaturas escritas manualmente Chamar APIs Win32 a partir de C# (CsWin32)
Inicializar um objeto WinRT com um handle de janela (selectores, diálogos, interface de partilha) Use as classes de interoperabilidade .NET WinRT COM (InitializeWithWindow, WindowNative, etc.) Chamar APIs de interoperação numa aplicação .NET
Verifique se uma API WinRT funciona numa aplicação desktop (não UWP) Consulte a lista de restrições e alternativas APIs WinRT não suportadas em aplicações de ambiente de trabalho
Veja um exemplo completo do WinUI 3 que personaliza uma janela usando chamadas Win32 Siga o tutorial do início ao fim Tutorial: aplicação WinUI 3 com interoperabilidade com Win32

Fluxograma rápido

  1. A API está num Windows.* espaço de nomes WinRT?

  2. É uma API Win32/nativa (definida num cabeçalho do SDK do Windows)?