2010-06-14 5 views
3

J'ai un programme s'exécutant dans C# qui est parfois mis à jour pendant qu'il s'exécute en remplaçant l'exe par un nouveau. Je veux que le programme vérifie régulièrement s'il a été mis à jour et si c'est le cas, redémarrez. J'utilise la fonction suivante pour ce faire.FileVersionInfo.GetVersionInfo Récupération de l'ancienne version d'un exe lors de l'exécution

public static bool DoINeedToRestart(string exe_name) 
    { 

     Version cur_version = new Version(MainProgram.StartVersion); 
     Version file_version = new Version(GetProductVersion(exe_name)); 
     MessageBox.Show("Comparing cur_version " + cur_version.ToString() + " with " + file_version.ToString()); 
     if (file_version > cur_version) 
     { 
      return true; 
     } 
     return false; 
    } 

    public static string GetProductVersion(string path_name) 
    { 
      FileVersionInfo myFI = FileVersionInfo.GetVersionInfo(path_name); 
      return myFI.FileVersion; 
    } 

MainProgram.StartVersion est réglé lorsque le programme commence à être la version actuelle à l'aide du GetProductVersion (exe_name)

exe_name est défini comme le nom de l'exécutable qui est mis à jour. Le problème que j'ai est une fois que le fichier MainProgram.exe a été mis à jour (je le vérifie manuellement en regardant les propriétés du fichier et en vérifiant la version du fichier), le GetProductVersion retourne toujours l'ancienne version du fichier et je ne sais pas pourquoi ! Toute aide est grandement appréciée. Je cours Windows Vista avec .Net 3.5.

Répondre

1

Quel système d'exploitation? Si c'est Windows, je crains que vous ne vous soyez trompé sur l'échange d'un fichier .exe en cours d'exécution - tous les programmes en cours d'exécution sont verrouillés par le gestionnaire de mémoire virtuelle dans le noyau Windows. Il est tout à fait possible qu'une bibliothèque .NET fasse une redirection en arrière-plan pour donner l'impression que le nouveau fichier est en place, mais seul l'accès aux fichiers via cette bibliothèque sera affecté.

EDIT: Pour autant que je sache, Windows résiste aux tentatives de supprimer ou de renommer non seulement l'exécutable qui est mappé en mémoire, mais également tous les répertoires parents. Puisque vous êtes sur Vista, il est possible que vous voyiez les effets d'une façade - pour les programmes non-administrateur, Windows redirige les écritures et les lectures ultérieures des répertoires Windows et Program Files dans une zone virtuelle par utilisateur. Si vous démarrez le programme par des moyens non élevés, vous pouvez en fait exécuter une copie de l'application dans la zone virtuelle. Le service d'installation (MSIEXEC) s'exécute avec des droits d'administrateur entièrement élevés, donc il est immunisé contre la redirection. Donc, je pose que Windows Installer écrase la version dans C: \ Program Files \ quelquechose, alors que votre application voit la version de% USERPROFILE% \ AppData \ Local \ VirtualStore \ Program Files \ quelle superposition, qui est inchangée. Normalement, si la version dans le répertoire "real" change, elle aura un temps de modification plus récent que la version overlay, donc la version "réelle" sera utilisée. Mais si le processus d'installation préserve l'heure de modification, il est possible que l'overlay ait l'heure la plus récente et continue à être utilisé.

+0

Bonjour Ben. Il fonctionne sous Windows Vista (.NET 3.5). Je comprends que le programme chargé dans le noyau ne peut pas être échangé, mais il semble que le fichier .exe sur le système de fichiers puisse l'être. Je semble pouvoir le supprimer ou le renommer sans affecter le fonctionnement du programme. Cela signifie-t-il que le programme en cours le verrait toujours même après l'avoir supprimé? –

+0

Excuses Ben mais j'ai besoin de me corriger. Je peux renommer le .exe d'un processus en cours mais je ne peux pas les supprimer - j'ai réessayé ceci plusieurs fois. Le programme d'installation de Windows est ce qui met à jour le fichier et qui semble être en mesure de supprimer l'ancienne version et de mettre le nouveau (quand vu à travers l'explorateur). Comme vous le dites, cela pourrait être une façade. –

+0

C'est intéressant. Comment commencez-vous le programme, et quel est le chemin? J'ajoute des informations supplémentaires à ma réponse car c'est trop long pour un commentaire. –

1

Je suppose qu'une mise en cache se produit derrière la scène. Pourquoi ne pas contourner le problème et créer un document texte vide appelé restart.txt et redémarrer si le fichier existe?

+0

Merci pour votre suggestion - c'est probablement ce que je vais finir par faire. J'étais également curieux de savoir ce qui se passait derrière la scène. –

Questions connexes