Start Debugging

O .NET 10 explodiu sua lista de NICs? Filtrando GetAllNetworkInterfaces() sem se enganar

Como filtrar GetAllNetworkInterfaces() no .NET 10 quando adaptadores virtuais de Hyper-V, Docker, WSL e VPNs lotam a lista. Inclui um filtro em duas etapas com trade-offs explícitos.

Se você acabou de migrar uma app de .NET 8 para .NET 10 e de repente NetworkInterface.GetAllNetworkInterfaces() retorna 80 adaptadores em vez de 10, não é impressão sua. Isso apareceu em uma thread de 7 de janeiro de 2026, com exatamente o tipo de dor do mundo real que faz mudanças de comportamento “menores” parecerem breaking changes: interfaces virtuais de Hyper-V, Docker, WSL, VPNs, loopback e outros adaptadores do sistema começam a abafar os dispositivos Ethernet e Wi-Fi “reais”.

Fonte: NetworkInterface.GetAllNetworkInterfaces breaking change (r/dotnet)

A verdade incômoda: “físico” é heurística

System.Net.NetworkInformation não te dá um único booleano oficial do tipo “isso é uma NIC física” no qual dê para confiar entre máquinas, drivers e features do Windows. A estratégia mais segura é construir um filtro que se ajuste às necessidades do seu produto, e tornar esse filtro auditável e testável.

Comece com sinais estritos que normalmente correlacionam com “útil para conectividade”:

Depois adicione exclusões mais flexíveis e específicas do ambiente (Docker, Hyper-V, WSL, VPN) como segunda etapa.

Um filtro em duas etapas que é explícito sobre os trade-offs

A thread propôs esta abordagem (cortada e levemente reforçada para legibilidade):

using System.Net.NetworkInformation;

var candidates = NetworkInterface.GetAllNetworkInterfaces()
    .Where(nic => nic.OperationalStatus == OperationalStatus.Up)
    .Where(nic => nic.NetworkInterfaceType is
        NetworkInterfaceType.Ethernet or
        NetworkInterfaceType.Wireless80211 or
        NetworkInterfaceType.GigabitEthernet)
    .Where(nic => !LooksVirtual(nic))
    .ToArray();

static bool LooksVirtual(NetworkInterface nic)
{
    var desc = (nic.Description ?? "").ToLowerInvariant();
    var name = (nic.Name ?? "").ToLowerInvariant();

    string[] keywords =
    {
        "virtual", "hyper-v", "vmware", "virtualbox",
        "docker", "vpn", "tap-", "wsl", "pseudo"
    };

    return keywords.Any(k => desc.Contains(k) || name.Contains(k));
}

É gambiarra? Sim. Mas também é honesto: reconhece que você está codificando uma política.

Para deixar isso menos frágil, evite depender só de strings:

Depure como um incidente de produção, não como curiosidade

Quando a sua contagem de adaptadores muda entre versões do .NET, trate como uma diferença de comportamento observável:

O .NET 10 te dá a lista crua. A sua app ainda precisa decidir o que significa “real”.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar