Как я могу определить пропускную способность в Windows 7, 8.1 и 10?

До сих пор я изо всех сил пытался получить MbnInterfaceManager работает (см. hresult из IMbnInterfaceManager::GetInterfaces, когда устройства MBN не существует), поэтому вместо этого я создал и отладил приложение без проблем из Visual Studio 2015, которое выполняло этот запрос WMI в C# (см. также Win32_PerfFormattedData_Tcpip_NetworkInterface документация):

string query = "SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();

Но затем, когда я развернул приложение в Windows 8.1, я получаю эту ошибку каждый раз, когда выполняется запрос:

System.Management.ManagementException: Invalid query 
   at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
   at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()

У кого-нибудь есть предложения по решению этой проблемы? Как я могу развернуть приложение, чтобы оно могло использовать такие запросы?

ОБНОВИТЬ:

Обратите внимание, что я могу создать и запустить приведенный выше код (как часть более крупного приложения WPF) из Visual Studio 2015 либо в Windows 7, либо в Windows 8.1, и я могу развернуть то же приложение, используя ClickOnce, в Windows 7, где оно успешно работает. По какой-то причине при развертывании этого приложения с помощью ClickOnce на Windows 8.1 я получаю Invalid query сообщение.

1 ответ

Решение

Я думаю, что я должен убедиться, что System.Management ссылка установлена ​​на "Копировать локально", но я не могу проверить это прямо сейчас. Если у кого-то есть идеи получше, пожалуйста, дайте мне знать.

ОБНОВИТЬ:

Невозможно использовать System.Management.dll в Windows 8.1 так же, как в Windows 7 или Windows 10.

Я обнаружил, что для выполнения операций, аналогичных тем, которые я упомянул в своем вопросе о телефоне Windows 8.1 и Windows 8, необходимо либо получить лицензию для разработчика Windows 8.1, либо в Windows 10 установить свой компьютер в "Режим разработчика", чтобы вы могли использовать Windows.Networking.Connectivity Пространство имен:

            string connectionProfileInfo = string.Empty;
            ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();

            if (InternetConnectionProfile == null)
            {
                rootPage.NotifyUser("Not connected to Internet\n", NotifyType.StatusMessage);
            }
            else
            {
                connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);
                OutputText.Text = connectionProfileInfo;
                rootPage.NotifyUser("Success", NotifyType.StatusMessage);
            }

            // Which calls this function, that allows you to determine how strong the signal is and the associated bandwidth
            string GetConnectionProfile(ConnectionProfile connectionProfile)
            {
                // ...
                    if (connectionProfile.GetSignalBars().HasValue)
                    {
                        connectionProfileInfo += "====================\n";
                        connectionProfileInfo += "Signal Bars: " + connectionProfile.GetSignalBars() + "\n";
                    }
                // ...
            } 

Обратите внимание, что вы должны убедиться, что ваш проект является Windows 8.1 PCL или приложением Windows 8.1, чтобы иметь возможность ссылаться на пространство имен.

Для получения дополнительной информации см. https://code.msdn.microsoft.com/windowsapps/network-information-sample-63aaa201

ОБНОВЛЕНИЕ 2:

Чтобы получить пропускную способность в Windows 7, 8.1 и 10, я использовал этот код:

    private int GetMaxBandwidth()
    {
        int maxBandwidth = 0;
        NetworkInterface[] networkIntrInterfaces  = NetworkInterface.GetAllNetworkInterfaces();

        foreach (var networkInterface in networkIntrInterfaces)
        {
            IPv4InterfaceStatistics interfaceStats = networkInterface.GetIPv4Statistics();
            int bytesSentSpeed = (int)(interfaceStats.BytesSent);
            int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived);

            if (bytesSentSpeed + bytesReceivedSpeed > maxBandwidth)
            {
                maxBandwidth = bytesSentSpeed + bytesReceivedSpeed;
            }
        }
    }
Другие вопросы по тегам