Как я могу определить пропускную способность в 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;
}
}
}