Почему я получаю исключение NullReferenceException при вызове GetIPv4Properties

Примечание. Мне известно и хорошо известно, что такое NullReferenceException есть, а как отлаживать и находить откуда - тут не в этом вопрос

Моя цель: для проекта в Unity3D я пытаюсь найти все сетевые интерфейсы моего устройства и сохранить их IpAddresses в списке для последующего использования. Позже я передам сообщение обо всех них.

Я следил за Как мне получить сеть интерфейс и его правильный IPv4-адрес? и Broadcasting UDP сообщение всем доступным сетевым картам (в частности, этот ответ) и попытался придумать следующий:

var addresses = new List<IPAddress>();

var allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

foreach (var networkInterface in allNetworkInterfaces)
{
    if (networkInterface.OperationalStatus != OperationalStatus.Up) continue;
    if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet)continue;
    if (!networkInterface.SupportsMulticast) continue;
    if (networkInterface.Supports(NetworkInterfaceComponent.IPv4) == false) continue;

    var ipProperties = networkInterface.GetIPProperties();
    if (ipProperties == null) continue;

    var ipv4Properties = ipProperties.GetIPv4Properties(); // !! EXCEPTION IS THROWN HERE !!
    if (ipv4Properties == null) continue;

    if (NetworkInterface.LoopbackInterfaceIndex == ipv4Properties.Index) continue;
            
    var unicastAddresses = ipProperties.UnicastAddresses;

    foreach (var unicastIpAddressInformation in unicastAddresses)
    {
        if (unicastIpAddressInformation.Address.AddressFamily != AddressFamily.InterNetwork) continue;

        addresses.Add(unicastIpAddressInformation.Address);
    }
}

// and yes I used Linq before but I converted it to the loop due to debug the exception ^^

Исключение

System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта
в (оболочка, управляемая в собственный) System.Net.NetworkInformation.Win32IPv4InterfaceProperties.GetPerAdapterInfo(int,System.Net.NetworkInformation.Win32_IP_PER_ADAPTER_INFO,int&)
at System.Net.NetworkInformation.Win32IPv4InterfaceProperties..ctor (System.Net.NetworkInformation.Win32_IP_ADAPTER_ADDRESSES addr, System.Net.NetworkInformation.Win32_MIB_IFROW mib) [0x00030] в ‹14e3453b740b4bd690e8d4ebr>NetworkInformat.5a013a715 Win32IPInterfaceProperties2.GetIPv4Properties () [0x00000] в ‹14e3453b740b4bd690e8d4e5a013a715›:0
в Broadcast.BroadCastTest (System.UInt16 BroadcastPort, клиент System.Net.Sockets.UdpClient) [0x000ae] в C:\cxxxs\79cast.Broadcast.

бросается в

var ipv4Properties = ipProperties.GetIPv4Properties();

где ipProperties не null, так что очевидно, что это откуда-то внутри GetIPv4Properties. Единственным возможным исключением, перечисленным в API, будет NetworkInformationException, но не NullReferenceException.

Также, прежде чем я проверил и уже убедился, что

networkInterface.Supports(NetworkInterfaceComponent.IPv4)

true (это мой интерфейс Ethernet, так что это явно интерфейс IPv4).

Почему возникает исключение и как его решить?

Я делаю что-то глупое? ^^


Обновлять

По принципу исправлю закомментировав пока просто пропущу проверку loopBack

// var ipv4Properties = ipProperties.GetIPv4Properties();
// if (ipv4Properties == null) continue;

// if (NetworkInterface.LoopbackInterfaceIndex == ipv4Properties.Index) continue;

Поскольку afaik петля уже должна быть покрыта, так как

networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback

person derHugo    schedule 25.09.2020    source источник
comment
Интересная проблема, и, я уверен, очень неприятная... Может ли это быть таким же, как эта ошибка единства? issuetracker.unity3d.com/issues/   -  person Ruzihm    schedule 25.09.2020
comment
@Ruzihm хм, интересно, может быть, это действительно ошибка ... тем более, что именно это используется во многих примерах ... было бы странно, если бы у меня это просто не получилось   -  person derHugo    schedule 05.10.2020