Erreur Winform C#

Résolu
L-Dlbcq - Modifié le 8 mars 2022 à 21:36
L-Dlbcq Messages postés 2 Date d'inscription samedi 12 mars 2022 Statut Membre Dernière intervention 19 octobre 2022 - 12 mars 2022 à 19:35
Bonjour,

Je developpe une petite application Winform C# pour retrouver les infos de réseau (IP, masque, passerelle, dns).

Mais depuis j'ai ce problème à l'éxécution du .EXE dans Debug :

System.ArgumentOutOfRangeException: L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index
à System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
à System.Collections.Generic.List`1.get_Item(Int32 index)
à System.Net.NetworkInformation.IPAddressCollection.get_Item(Int32 index)
à NUTs_App.Net_Infos_Form.Get_Infos(Object sender, EventArgs e) dans C:\Users\Louis\source\repos\L-Dlbcq\IP-Address-and-Subnet-Mask-Finder\MainForm.cs:ligne 53
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ButtonBase.WndProc(Message& m)
à System.Windows.Forms.Button.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Assemblys chargés **************mscorlib Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4470.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll----------------------------------------Network Utility Tools - NUTs Version de l'assembly : 1.0.0.0 Version Win32 : 1.0.0.0 CodeBase : file:///C:/Users/Louis/source/repos/L-Dlbcq/IP-Address-and-Subnet-Mask-Finder/bin/Debug/Network%20Utility%20Tools%20-%20NUTs.exe----------------------------------------System.Windows.Forms Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4400.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll----------------------------------------System Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4360.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll----------------------------------------System.Drawing Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4390.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll----------------------------------------System.Configuration Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4190.0 built by: NET48REL1LAST_B CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll----------------------------------------System.Core Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4470.0 built by: NET48REL1LAST_C CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll----------------------------------------System.Xml Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll----------------------------------------mscorlib.resources Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/mscorlib.resources.dll----------------------------------------System.Windows.Forms.resources Version de l'assembly : 4.0.0.0 Version Win32 : 4.8.4084.0 built by: NET48REL1 CodeBase : file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/System.Windows.Forms.resources.dll----------------------------------------


avez vous une idée de ce que je peux faire pour résoudre ce soucis ?

Voici le code C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Management;
using System.Windows.Forms;


namespace NUTs_App
{
    public partial class Net_Infos_Form : Form
    {
        public Net_Infos_Form()
        {
            InitializeComponent();
        }

        private void Get_Infos(object sender, EventArgs e)
        {
            
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && adapter.Name == "Ethernet")
                        {
                            IP_txtbx.Text = (ip.Address.ToString());
                            Subnet_txtbx.Text = (ip.IPv4Mask.ToString());
                            
                        }
                        foreach (GatewayIPAddressInformation gateway in adapter.GetIPProperties().GatewayAddresses)
                        {
                            Gateway_txtbx.Text = gateway.Address.ToString();
                        }
                    }

                }
                IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                IPAddressCollection dnsServers = adapterProperties.DnsAddresses;
                if (dnsServers.Count != 0)
                {
                    foreach (IPAddress dns in dnsServers)
                    {
                        DNS1_txtbx.Text = dnsServers[1].ToString();
                        DNS2_txtbx.Text = dnsServers[2].ToString();

                    }
                }
                else
                {
                    DNS1_txtbx.Text = "0";
                    DNS1_txtbx.Text = "0";
                }
            }

        }

        private void Close_App(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Change_to_FR(object sender, EventArgs e)
        {
            
            IP.Text = "Adresse IP";
            Subnet.Text = "Masque de sous réseau";
            Gateway.Text = "Passerelle par défaut";
            DNS1.Text = "DNS primaire";
            DNS2.Text = "DNS secondaire";
            get_infos_btn.Text = "RECUPERER INFOS";
            close_btn.Text = "FERMER";
            this.Text = "Network Utility Tools - NUTs";
            Language.Text = "Langue";
            french_btn.Text = "Français";
            english_btn.Text = "Anglais";

        }

        private void Change_to_EN(object sender, EventArgs e)
        {
            IP.Text = "IP address";
            Subnet.Text = "Subnet Mask";
            Gateway.Text = "Default Gateway";
            DNS1.Text = "Primary DNS";
            DNS2.Text = "Secondary DNS";
            get_infos_btn.Text = "RETRIEVE INFOS";
            close_btn.Text = "CLOSE";
            this.Text = "Network Utility Tools - NUTs";
            Language.Text = "Language";
            french_btn.Text = "French";
            english_btn.Text = "English";
        }
    }
}
A voir également:

11 réponses

Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
9 mars 2022 à 08:31
Bonjour

Tout d’abord merci d’avoir essayé d’utiliser les balises de codes, mais pas tout à fait correctement. Pour tes prochains merci de lire ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Mais depuis j'ai ce problème à l'éxécution du .EXE dans Debug :
et quand tu le lances avec visual studio que se passe t il?


0
Il me renvoie la même erreur.

J’ai compris qu’il s’agissait de l’appel d’une collection vide mais pourtant dans le cas où je lance l’app depuis le dossier Debug, j’ai bien deux adresses qui sont écrite dans les champs textes prévu à cet effet.

J’ai beau fouiller sur MSDN, Stackoverflow je ne trouve aucune alternative.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
10 mars 2022 à 12:53
Avec VS, ça te renvoie l'erreur à quelle ligne?
Quel est le contenu des variables ?


0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
10 mars 2022 à 12:53
C'est pas sur MSDN ou Stackoverflow que tu vas trouver ta solution, mais en déboggant...
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 10 mars 2022 à 16:44
Bonjour
En lançant le projet avec Visual Studio à quelle ligne se produit l'erreur comme dit Whismeril ( que je salue) ?
Quelle est la valeur de
dnsServers.Count
à la ligne 49 ?

0
dnsServers.Count me renvoi System.Net.NetworkInformation.IPAddressCollection
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655 > L-Dlbcq
11 mars 2022 à 23:07
ha ben voilà qui est étonnant, puisque Count est sensé renvoyer un nombre entier...
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024
11 mars 2022 à 23:15
Bonsoir Whis
C'est dnsServers qui renvoie System.Net.NetworkInformation.IPAddressCollection
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
12 mars 2022 à 00:00
Oui je sais ;), mais je voulais qu'il cherche par lui même
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonsoir a tous,

En lançant le projet avec Visual Studio, l'erreur intervient ligne 46, c'est à dire au moment où je tente d'inscrire la valeur dnsServers[1] dans DNS1_txtbx

D'après certains dev avec qui j'ai pu aussi discuter, il s'agit du fait que dnsServers, membre de IPAddressCollection est une collection vide.

Voici le code complet:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Management;
using System.Windows.Forms;

namespace Address_and_Subnet_Mask_Finder
{
    public partial class Network_Infos_Form : Form
    {
        public Network_Infos_Form()
        {
            InitializeComponent();
        }

        private void Get_Infos(object sender, EventArgs e)
        {
             foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            string myIP = (ip.Address.ToString());
                            IP_txtbx.Text = myIP;
                            string mySubnet = (ip.IPv4Mask.ToString());
                            Subnet_txtbx.Text = mySubnet;
                        }
                    }
                    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                    IPAddressCollection dnsServers = adapterProperties.DnsAddresses;
                    if (dnsServers.Count > 0)
                    {
                        foreach (IPAddress dns in dnsServers)
                        {
                             DNS1_txtbx = dnsServers[1].ToString();
                             DNS2_txtbx = dnsServers[2].ToString();
                        }
                    }
                }
            }
        }

        private void Close_App(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
12 mars 2022 à 12:49
Bonjour
dnsServers.Count
ne peut pas être = à 0 car dans ce cas tu ne passerais pas pas la boucle
foreach (IPAddress dns in dnsServers)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
11 mars 2022 à 23:12
Bonjour
Vous dîtes "D'après certains dev avec qui j'ai pu aussi discuter, il s'agit du fait que dnsServers, membre de IPAddressCollection est une collection vide."
C'est pour cela que je vous ai demandé quelle était la valeur de
dnsServers.Count
à la ligne 49 . Pour cela il faut lancer le projet avec Visual Studio et posez un point d'arrêt sur cette même ligne 49 . En exécutant la ligne 49 en pas à pas vous aurez cette valeur .
Cela s'appelle le débogage . Voir ce tuto : https://docs.microsoft.com/fr-fr/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2022.
Et ensuite ce ne sera pas un
foreach
car dans certains cas aux ligne 46 et 47 les 2 DNS sont identiques alors que dans d'autres ils sont différents . Et c'est pour cela que je vous ai demandé la valeur de
dnsServers.Count
0
Dans ce cas, que puis-je faire pour obtenir une valeur qui correspond à une adresse ?

Je tenais aussi à préciser que je suis débutant en C# donc je mets un peu de temps à comprendre mes erreurs.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
12 mars 2022 à 07:51
Bonjour

tu es débutant, OK, ça arrive à tout le monde.
Mais tu présentes un code qui n'a rien d'un code de débutant.
Donc soit tu n'es plus si débutant que ça, soit tu as brulé les étapes (et ça ça arrive aussi à beaucoup de gens, moi y compris il y a des années) et tu as trouvé ça sur internet et tu essayes de le modifier plus ou moins au pif.

Si tu as brulé les étapes, et bien figure toi, ça ne marche pas.
On finit toujours pas bloquer quelque part car il y a des bases que l'on a pas acquises.

Donc je te propose de laisser ton projet de coté quelques jours. De prendre le temps de lire ce cours https://tahe.developpez.com/dotnet/csharp/ et ensuite de revenir à ton projet.
Ce cours ne fera pas de toi un codeur expert, mais tu y trouveras le socle nécessaire à débuter ta formation.
Et en plus on aura un langage commun, quand on te demanderas de nous donner ce que retourne une variable, tu sauras ce que ça veut dire et donc ensemble on débugguera plus vite.
0
Bonjour Whismeril,

Après avoir relu la page sur l'IPAddressCollection.DnsServers, j'ai compris ou était mon erreur. Il manquait ce code spécifique:
        public 
            IPAddressCollection 
            DnsAddresses { get; }


Après l'avoir réintégrer au code, il me fallait récupérer les adresses DNS correspondante à la carte ET en forme IPv4 (j'ai rencontré une erreur mais assez vite résolu).

Ceci donne donc la chose suivante dans mon programme:

            foreach(NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                IPAddressCollection dnsServers = adapterProperties.DnsAddresses;

                if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
                    {
                        if (dnsServers.Count > 0 && ip.Address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            foreach (IPAddress dns in dnsServers)
                            {
                                primdns_TxtBx1.Text = dnsServers[0].ToString();
                                secdns_TxtBx1.Text = dnsServers[1].ToString();
                            }
                        }
                    }
                }
            }


Et en débogguant ou en executant le .EXE du répertoire Debug, plus aucune erreur !

Je tiens a repréciser que j'avais déjà fait quelques applications CSharp mais jamais utiliser de collection, c'est pourquoi je vais prendre le temps de lire le cours que tu m'as conseillé. En tout cas merci d'avoir pu m'apporter de l'aide !
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
12 mars 2022 à 17:12
Très bien, pense à marquer le sujet résolu dans ce cas.
0
L-Dlbcq Messages postés 2 Date d'inscription samedi 12 mars 2022 Statut Membre Dernière intervention 19 octobre 2022
Modifié le 12 mars 2022 à 19:37
Très bien je mets en résolu

Je n'ai pas de bouton "mettre en résolu"
0
Rejoignez-nous