如何确定Windows 7,8.1和10上的带宽?

时间:2017-03-28 23:59:09

标签: c# visual-studio windows-8.1 wmi clickonce

到目前为止,我一直在努力让MbnInterfaceManager工作(请参阅hresult from IMbnInterfaceManager::GetInterfaces when no MBN device exists),因此我在Visual Studio 2015中构建并调试了一个没有问题的应用程序,在C#中执行此WMI查询(请参阅也是Win32_PerfFormattedData_Tcpip_NetworkInterface documentation):

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()

有人对如何解决此问题有任何建议吗?如何部署应用程序以便它能够使用这样的查询?

更新

请注意,我可以在Windows 7或Windows 8.1上的Visual Studio 2015中构建和运行上述代码(作为更大的WPF应用程序的一部分),我可以使用ClickOnce将相同的应用程序部署到Windows 7上运行成功。出于某种原因,当我使用ClickOnce将此应用程序部署到Windows 8.1时,我收到了Invalid query消息。

1 个答案:

答案 0 :(得分:0)

我认为我要做的是确保System.Management引用设置为“复制本地”,但我现在无法对其进行测试。如果有人有任何更好的想法,请随时告诉我。

<强>更新

无法在Windows 8.1上使用System.Management.dll,就像在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";
                    }
                // ...
            } 

请注意,您必须确保您的项目是Window 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;
            }
        }
    }