IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

comparer les versions pour MàJ [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Par défaut comparer les versions pour MàJ
    Bonjour à Tous,
    je suis nouveau et surtout débutant.

    je développe un petit programma avec VB .NET (VS 2008), dans le quel j'ai un Form pour la recherche de mise à jour

    j'utilise un fichier XML que j'arrive à parser et récupérer la valeur du noeud "Version" que j'assigne à une variable newVer
    quand je compare cette variable à celle qui stock la version en cours j'ai toujours le même résultat quelques soient les valeurs (identique ou pas)

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Public Class Updater
     
        Public curVer As String = My.Application.Info.Version.ToString
     
        Public newVer As String = ""
     
        Public Sub Updater_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            getVer(curVer, newVer)
            lblUpdate.Text = "Recherche des mises à jour en cours..."
            okButton.Enabled = False
            majButton.Enabled = False
            Dim r As Boolean = String.Compare(curVer, newVer)
            If r = False Then
                lblUpdate.Text = "Une mise à jour est disponible version:" + newVer
                majButton.Enabled = True
            Else  
                lblUpdate.Text = "Vous disposez déjà de la dernière version:" + curVer
                okButton.Enabled = True
            End If
     
        End Sub
     
        Public Function getVer(ByVal curVer, ByVal newVer)
            Dim XmlDoc As Xml.XmlDocument = New Xml.XmlDocument()
            XmlDoc.Load("http://www.monsite.com/downloads/last_version.xml")
            Dim element As Xml.XmlNodeList
            Dim noeudEnf As Xml.XmlNode
            element = XmlDoc.DocumentElement.GetElementsByTagName("version")
            For Each noeudEnf In element
                If noeudEnf.LocalName = "version" Then
                    newVer = noeudEnf.InnerText.ToString
                    MsgBox(curVer & "-" & newVer) ' ################# Jusqu'à ici c'est bon, les valeurs affiché son les bons ##############
                End If
            Next
            Return newVer
        End Function
     
        Public Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okButton.Click
            Me.Close()
        End Sub
     
        Public Sub majButton_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles majButton.Click
            Try
                System.Diagnostics.Process.Start("http://www.monsite.com/downloads/Setup.exe")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            Me.Close()
        End Sub
    Merci pour la lecture et l’éventuelle aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Salut,
    je ne vais pas t'aider à résoudre ton problème de fichier XML ... Mais je vais te donner la façon dont je procède pour faire rechercher les mises à jour avec mes programmes :

    Tout d'abord il te faut un compte Dropbox tu t'inscrit et tu installe le logiciel.

    Une fois que c'est fait, tu va dans le dossier public qui se trouve sur ton PC normalement ici : "C:\Users\NomDeTaSession\Dropbox\Public"
    Tu crée un fichier .txt où tu inscrit la version de ton logiciel par exemple 1.0.0.0
    Attention, la syntaxe est très précise, il te faut exactement les 4 chiffres tu comprendra par la suite pourquoi.
    Toujours dans ton dossier, tu clique droit sur le fichier .txt puis sur l'onglet dropbox et copier le lien public puis note le lien dans un coin.

    Bien, maintenant que c'est fait tu va dans ton application et au chargement du formulaire principal ou du bouton rechercher une mise à jour ... Tu inscrit ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            Try
                Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("TON LIEN QUE TU AS PRECEDEMENT COPIE")
                Dim response As System.Net.HttpWebResponse = request.GetResponse()
                Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())
                Dim newestversion As String = sr.ReadToEnd()
                Dim currentversion As String = Application.ProductVersion
                If newestversion.Contains(currentversion) Then
                Else
                        MsgBox("Une nouvelle version du logiciel est disponnible", MsgBoxStyle.Exclamation)
            Catch
                    MsgBox("Impossible rechercher une version plus récente du logiciel, car aucune connexion internet n'est présente", MsgBoxStyle.Exclamation)
                End If
            End Try
    Donc pour te résumer, si la version de l'assembly de ton application est identique à celle inscrite sur le .txt, il n'y aura pas de message, si non si elle est différente il y aura le message.

    J'espère t'avoir aidé !

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    - quand tu créés une méthode/fonction avec des paramètres ils sont par défaut ByVal
    ca veut dire qu'une copie du contenu de variable est passée à la méthode
    avec ByRef, c'est le pointeur vers la variable qui est passée
    l'incidence c'est que si la méthode modifie la variable, avec byval ca ne change pas la valeur dans l'appelant, avec byref ca change la valeur dans l'appelant
    dans ton cas newVer est passé à la méthode par défaut il vaut "", dans la méthode il est modifié newVer = noeudEnf.InnerText.ToString

    - tu as une variable de classe et un péramètre de méthode qui ont le même nom c'est à proscrire (newVer et l'autre aussi je pense)
    dans la méthode si tu utilises newVer c'est le paramètre de la méthode qui est ciblé, pas la variable de classe, ca prete à confusion ...
    soit tu fais une variable de classe et dans ce cas la méthode n'a pas besoin de paramètre, soit tu renommes le paramètre

    - getVer(ByVal curVer, ByVal newVer)
    il faut typer les paramètres, byval curver as string, ca laisse moins de place aux doutes et aux bugs
    de plus il conseillé de mettre "option strict" à ON dans les propriétés du projet pour que le compilateur bloque dès qu'il voit des trucs un peu limites, ce qui oblige à bien coder

    -Public Function getVer(ByVal curVer, ByVal newVer)
    une fonction retourne quelque chose, donc il faut préciser quoi aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function getVer(ByVal curVer, ByVal newVer) as string
    - StringCompare ne retourne pas un booléen mais un int qui vaut 0 quand les valeurs sont identiques (dixit l'aide msdn via F1)
    avec option strict on, le compilateur te l'aurait dit d'ailleurs


    bref beaucoup de défauts de codage dans ton code, ta fonction, soit elle prend des paramètres et les modifies (une méthode peut alors suffire), soit elle ne les modifies pas et retourne quelque chose, soit elle utilises les variables de classes, mais il ne faut pas faire les 3 en même temps
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    EDIT : Pol63 est tjs plus rapide...

    Bonjour,

    Vous avez un problème avec vos variables global que vous avez déclaré dans votre class et les paramètres de votre fonction getVer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Class Updater
     
        Public curVer As String = My.Application.Info.Version.ToString
     
        Public newVer As String = ""
    VS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Public Function getVer(ByVal curVer, ByVal newVer)
            Dim XmlDoc As Xml.XmlDocument = New Xml.XmlDocument()
            XmlDoc.Load("http://www.monsite.com/downloads/last_version.xml")
            Dim element As Xml.XmlNodeList
            Dim noeudEnf As Xml.XmlNode
            element = XmlDoc.DocumentElement.GetElementsByTagName("version")
            For Each noeudEnf In element
                If noeudEnf.LocalName = "version" Then
                    newVer = noeudEnf.InnerText.ToString
                    MsgBox(curVer & "-" & newVer) ' ################# Jusqu'à ici c'est bon, les valeurs affiché son les bons ##############
                End If
            Next
            Return newVer
        End Function
    Dans l'état des chases je la modifierais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Public Sub getVer() 
            Dim XmlDoc As Xml.XmlDocument = New Xml.XmlDocument()
            XmlDoc.Load("http://www.monsite.com/downloads/last_version.xml")
            Dim element As Xml.XmlNodeList
            Dim noeudEnf As Xml.XmlNode
            element = XmlDoc.DocumentElement.GetElementsByTagName("version")
            For Each noeudEnf In element
                If noeudEnf.LocalName = "version" Then
                    newVer = noeudEnf.InnerText.ToString
                    MsgBox(newVer) ' ################# Jusqu'à ici c'est bon, les valeurs affiché son les bons ##############
                End If
            Next
     
        End Function
    De cette manière vous travaillerez sur les variables global et non sur les paramètres de la méthode...


    P.S. : Si vous cherchez un moyen simple d'installation de nouvelle version, Visual Studio intègre un outil puissant qui s'appel ClickOnce

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il y a au moins 3 problèmes qui me sautent aux yeux dans ton code :

    • D'abord, le paramètre newVer de la méthode getVer est passé par valeur (ByVal), donc quand la méthode le modifie, ça ne change pas la valeur du point de vue de l'appelant. C'est exactement comme si tu manipulais une variable locale. Ca ne modifie pas non plus la variable newVer de la classe, car le fait d'avoir un paramètre du même nom "cache" la variable de classe. Ce problème pourrait être masqué par le fait que la méthode renvoie la valeur, mais puisque tu n'utilises pas la valeur de retour dans Updater_Load, tu récupères toujours la valeur d'origine de newVer, soit une chaine vide.

      De toutes façons, la méthode getVer n'a pas besoin de prendre curVer et getVer en paramètre : curVer n'est pas utilisée à part dans la MessageBox, et newVer est le résultat. Tu n'as pas non plus besoin d'avoir curVer et newVer en variables de classe. Ta méthode getVer devrait plutôt ressembler à ça :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      Public Function getVer() As String
              Dim XmlDoc As Xml.XmlDocument = New Xml.XmlDocument()
              XmlDoc.Load("http://www.monsite.com/downloads/last_version.xml")
              Dim element As Xml.XmlNodeList
              Dim noeudEnf As Xml.XmlNode
              element = XmlDoc.DocumentElement.GetElementsByTagName("version")
              For Each noeudEnf In element
                  If noeudEnf.LocalName = "version" Then
                      Return noeudEnf.InnerText
                  End If
              Next
              Return ""
          End Function
      (on peut encore simplifier ce code, mais on verra ça plus tard)

      Et pour l'utiliser dans Updater_Load, tu peux faire comme ça :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Dim curVer As String = My.Application.Info.Version.ToString()
      Dim newVer As String = getVer()
    • La méthode String.Compare ne renvoie pas un boolean mais un entier (tu devrais d'ailleurs activer Option Strict On, ça permettrait de détecter ce genre d'erreur à la compilation). String.Compare(a, b) renvoie 0 si a = b, une valeur négative si a < b, et une valeur positive si a > b. Donc avec la conversion implicite en Boolean, 0 va être converti en False et toutes les autres valeurs vont être converties en True. C'est donc le contraire de ce que tu veux...

      Il faudrait donc faire comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
              Dim r As Integer = String.Compare(curVer, newVer)
              If r < 0 Then
                  lblUpdate.Text = "Une mise à jour est disponible version:" + newVer
                  majButton.Enabled = True
              Else  
                  lblUpdate.Text = "Vous disposez déjà de la dernière version:" + curVer
                  okButton.Enabled = True
              End If
    • Mais de toutes façons, même comme ça, ça ne fonctionnerait pas : String.Compare teste l'ordre alphabétique, ce qui n'a pas de sens pour comparer des versions. Par exemple, il est évident que la version 10 est supérieure à la version 9, mais la chaine "10" vient avant "9" dans l'ordre alphabétique, elle est donc considérée comme inférieure. Idem pour "1.10" qui sera considéré comme inférieur à "1.9". Le plus simple est d'utiliser la classe Version pour faire la comparaison


    Au final je te suggère le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Public Class Updater
     
        Public Sub Updater_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' pas vraiment utile vu que la Form n'est pas encore visible pendant le Load...
            ' lblUpdate.Text = "Recherche des mises à jour en cours..."
     
            Dim curVer As Version = My.Application.Info.Version
            Dim newVer As Version = getVer()
            okButton.Enabled = False
            majButton.Enabled = False
     
            If newVer IsNot Nothing AndAlso newVer > curVer Then
                lblUpdate.Text = "Une mise à jour est disponible version:" + newVer
                majButton.Enabled = True
            Else  
                lblUpdate.Text = "Vous disposez déjà de la dernière version:" + curVer
                okButton.Enabled = True
            End If
     
        End Sub
     
        Public Function getVer() As Version
            ' Plus simple avec Linq to XML...
            Dim doc As System.Xml.Linq.XDocument = System.Xml.Linq.XDocument.Load("http://www.monsite.com/downloads/last_version.xml")
            Dim element As XElement = doc.Root.Element("version")
            If element IsNot Nothing Then
                Return Version.Parse(element.Value)
            End If
            Return Nothing
        End Function
     
        ...
    (pas testé, il y a peut-être quelques erreurs...)

  6. #6
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 2
    Par défaut
    Bonjour tout le monde et un grand merci pour votre aide grâce à laquelle j'ai pu résoudre le problème mais aussi comprendre plusieurs choses.
    voici le code fonctionnel (j'espère qu'il n'y a pas trop de charabia -de codeur de dimanche que je suis- dedans)

    * If newVer.Equals(curVer) = True Then
    "Equals" au lieu de "compare"
    * Public Function getVer(ByRef curVer As String, ByRef newVer As String) As String
    ByRef au lieu de ByVal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Public Sub Updater_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            getVer(curVer, newVer)
            lblUpdate.Text = "Recherche des mises à jour en cours..."
            okButton.Enabled = False
            majButton.Enabled = False
            If newVer.Equals(curVer) = True Then
                lblUpdate.Text = "Vous disposez déjà de la dernière version:" + curVer
                okButton.Enabled = True
            Else
                lblUpdate.Text = "Une mise à jour est disponible version:" + newVer
                majButton.Enabled = True
            End If
     
        End Sub
     
        Public Function getVer(ByRef curVer As String, ByRef newVer As String) As String
            Dim XmlDoc As Xml.XmlDocument = New Xml.XmlDocument()
            XmlDoc.Load("http://www.noorweb.net/downloads/radionet/radionet_last_version.xml")
            Dim element As Xml.XmlNodeList
            Dim noeudEnf As Xml.XmlNode
            element = XmlDoc.DocumentElement.GetElementsByTagName("version")
            For Each noeudEnf In element
                If noeudEnf.LocalName = "version" Then
                    newVer = noeudEnf.InnerText.ToString
                End If
            Next
            Return newVer
        End Function
    Encore merci

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Mouais, enfin tu as "résolu le problème" de la pire façon possible... J'aimerais vraiment pas devoir maintenir ce code

    - curVer et newVer sont toujours des champs de la classe alors qu'il n'y a aucune raison
    - il n'y a toujours aucune raison de passer curVer en paramètre de getVer
    - tu manipules toujours des chaines de caractères avec tous les problèmes que ça peut poser
    - et si j'ai une version plus récente que celle du serveur (par exemple une beta de la version suivante), ça va aller chercher la version plus ancienne vu que tu testes seulement si c'est une version différente (et non pas plus récente)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compiler en executable, version pour les nuls
    Par gwenc_hlan dans le forum Déploiement/Installation
    Réponses: 8
    Dernier message: 11/12/2012, 15h00
  2. Comparer les versions de sources
    Par chougadosu dans le forum ANT
    Réponses: 11
    Dernier message: 05/04/2011, 12h14
  3. Tableau pour comparer les dates
    Par And_res dans le forum Débuter
    Réponses: 13
    Dernier message: 29/10/2008, 16h02
  4. Réponses: 3
    Dernier message: 20/12/2006, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo