2017-03-28 3 views
0

Jusqu'à présent, j'ai eu du mal à obtenir MbnInterfaceManager de travail (voir hresult from IMbnInterfaceManager::GetInterfaces when no MBN device exists), donc au lieu que je construit et déboguer une application sans problème à partir de Visual Studio 2015 qui a exécuté cette requête WMI en C# (voir aussi le Win32_PerfFormattedData_Tcpip_NetworkInterface documentation):Comment puis-je déterminer la bande passante sur Windows 7, 8.1 et 10?

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

Mais quand je déployé l'application Windows 8.1, je reçois cette erreur chaque fois que la requête est exécutée:

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

quelqu'un at-il des suggestions sur la façon de résoudre ce problème? Comment puis-je déployer une application pour pouvoir utiliser des requêtes comme celle-ci?

MISE À JOUR:

S'il vous plaît noter que je peux construire et exécuter le code ci-dessus (dans le cadre d'une application WPF plus) à partir de Visual Studio 2015 sous Windows 7 ou Windows 8.1, et je peux déployer même application en utilisant ClickOnce sur Windows 7 où il fonctionne avec succès. Pour une raison quelconque, lorsque je déploie cette application en utilisant ClickOnce sur Windows 8.1, je reçois le message Invalid query.

Répondre

0

Je pense que ce que je dois faire est de m'assurer que la référence System.Management est définie sur "Copier Local" mais je ne suis pas en mesure de le tester maintenant. Si quelqu'un a de meilleures idées, n'hésitez pas à me le faire savoir.

MISE À JOUR:

Il est impossible d'utiliser System.Management.dll sous Windows 8.1 de la même manière il est utilisé sur Windows 7 ou Windows 10.

J'ai trouvé que pour effectuer des opérations similaires à celles que j'ai mentionnées dans ma question sur Windows 8.1 et Windows 8 téléphone vous devez soit obtenir une licence développeur Windows 8.1 ou sur Windows 10 définir votre ordinateur en "mode développeur" afin que vous puissiez utiliser l'espace de noms 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"; 
        } 
       // ... 
      } 

Veuillez noter que vous devez vous assurer que votre projet est une application Windows 8.1 PCL ou Windows 8.1 pour pouvoir référencer l'espace de noms.

Pour plus de détails s'il vous plaît voir https://code.msdn.microsoft.com/windowsapps/network-information-sample-63aaa201

MISE À JOUR 2:

Pour être en mesure d'obtenir une bande passante sur Windows 7, 8.1 et 10, je me suis retrouvé à l'aide de ce code:

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; 
      } 
     } 
    }