Escolha sua abordagem de interoperabilidade para aplicativos Windows

Windows aplicativos da área de trabalho (WinUI 3, WPF, WinForms, console) às vezes precisam chamar APIs fora de sua estrutura gerenciada. Esta página ajuda você a entender quando isso acontece e escolher a técnica certa.

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

Windows expõe a funcionalidade por meio de duas superfícies de API principais:

  • APIs win32 — as funções clássicas no estilo C exportadas de DLLs do sistema (user32.dll, , kernel32.dlletc shell32.dll.). Elas abrangem operações de baixo nível, como gerenciamento de janelas, E/S de arquivo, controle de processo e acesso de hardware. Eles existem desde as primeiras versões do Windows e continuam sendo a maneira de acessar muitos recursos do sistema operacional que não têm equivalente gerenciado.

  • APIs do Windows Runtime (WinRT) — uma superfície de API moderna orientada a objetos (namespaces começando comWindows.*) introduzida com Windows 8. As APIs do WinRT abrangem áreas como notificações, captura de mídia, Bluetooth, localização geográfica e muito mais. A maioria das APIs do WinRT pode ser acessada diretamente do .NET sem esforço especial, mas algumas têm restrições em aplicativos para desktop ou exigem um identificador de janela (HWND) para funcionar.

Quando você encontrará interoperabilidade

Normalmente, você precisa de interoperabilidade quando a estrutura do aplicativo não expõe diretamente uma funcionalidade específica do sistema operacional. Cenários comuns incluem:

Scenario Qual superfície de API Example
Personalizar a barra de título ou o posicionamento da janela Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Definir uma janela como "sempre na parte superior" ou controlar a ordem Z Win32 SetWindowPos com HWND_TOPMOST
Mostrar um seletor de arquivo ou uma caixa de diálogo de compartilhamento do WinUI 3 WinRT (precisa de HWND) FileOpenPicker com InitializeWithWindow
Ler a memória do sistema ou os contadores de desempenho Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Registrar uma chave de acesso global Win32 RegisterHotKey
Enviar uma notificação do sistema (aplicativo não empacotado) WinRT (com o SDK do Aplicativo) AppNotificationManager

Em todos esses casos, você escreve código C# normal, mas chama Windows por meio de uma camada de interoperabilidade. Os tópicos a seguir orientam você por cada abordagem.

Guia de decisão

Eu preciso... Abordagem recomendada Tópico
Chamar uma API Win32 (user32, kernel32, shell32, etc.) a partir de C# Use o gerador de código-fonte CsWin32 — seguro em termos de tipo, sem assinaturas escritas manualmente Invocar APIs Win32 a partir de C# (CsWin32)
Inicializar um objeto WinRT com um identificador de janela (seletores, caixas de diálogo, compartilhar interface do usuário) Use as classes de interoperabilidade COM do WinRT do .NET (InitializeWithWindow, WindowNative, etc.) Chamar APIs de interoperabilidade de um aplicativo .NET
Verificar se uma API do WinRT funciona em um aplicativo da área de trabalho (não UWP) Consulte a lista de restrições e alternativas APIs do WinRT não compatíveis com aplicativos de desktop
Veja um exemplo completo do WinUI 3 que personaliza uma janela usando chamadas do Win32 Siga o guia completo Passo a passo: aplicativo WinUI 3 com interoperabilidade do Win32

Fluxograma rápido

  1. A API está em um Windows.* namespace do WinRT?

  2. É uma API win32/nativa (definida em um cabeçalho do SDK Windows)?

    • Sim, → use CsWin32 para gerar associações P/Invoke com segurança de tipo.
    • Não → Pode ser uma interface COM ou uma biblioteca nativa de terceiros. Consulte .NET: interoperabilidade com código nativo para obter orientações gerais sobre P/Invoke.