Pendant la période de recette d'une application, il est fréquent de devoir désinstaller/réinstaller les packages MSI générés par Visual Studio sur tous les postes.
Etant actuellement confronté à ce problème, je me suis demandé comment je pouvais automatiser la mise à jour des postes clients sans envoyer de MSI...

La solution proposée par Rémi Thomas sur c2i (http://www.c2i.fr/code.aspx?IDCode=590), fonctionne parfaitement mais l'environnement qui m'est imposé m'empêche d'utiliser un serveur IIS.
Voici donc la solution que j'ai retenu :

Tout d'abord, j'ai modifié la manière dont démarre mon application pour qu'elle soit lancé à partir d'un autre exécutable, celui sera chargé de vérifier la présence d'une nouvelle version dans un répertoire réseau spécifié. Le cas échéant, il copiera depuis ce répertoire l'intégralité des fichiers présents vers celui de mon application.
Enfin, il lancera mon application.

Voici le code que j'utilise :

private void frmBootStrap_Load(object sender, System.EventArgs e) {
 string pathMAJ = System.Configuration.ConfigurationSettings.AppSettings["PathCrm"];
 DateTime lastUpdate = DateTime.MinValue;
 if (File.Exists(Application.StartupPath + @"\CRM\CRM.exe")) {
  lastUpdate = File.GetCreationTime(Application.StartupPath + @"\CRM\CRM.exe");
 }
 if (lastUpdate < File.GetCreationTime(pathMAJ + "CRM.exe")) {
  this.Visible = true;
  this.Refresh();
  string fileName;
  if (!Directory.Exists(Application.StartupPath + "\\CRM")) {
   Directory.CreateDirectory(Application.StartupPath + "\\CRM");
  }
  progressBar1.Maximum = Directory.GetFiles(pathMAJ).Length;
  progressBar1.Step = 1;
  foreach (string file in Directory.GetFiles(pathMAJ)) {
   fileName = file.Substring(file.LastIndexOf("\\") + 1);
   lbMAJ.Text = "Copie du fichier " + fileName;
   progressBar1.PerformStep();
   this.Refresh();
   System.Diagnostics.Debug.WriteLine(file, fileName);
   File.Copy(file, Application.StartupPath + "\\CRM\\" + fileName, true);
  }
  lbMAJ.Text = "Mise à jour terminée... Ouverture de l'application CRM";
  this.Refresh();
 }
 System.Diagnostics.Process.Start(Application.StartupPath + "\\CRM\\CRM.exe");
 Application.Exit();
}

Il est aussi possible de tester chaque fichier et ne copier que ceux qui ont été mis à jour, ou bien de tester le hashage MD5.

Sébastien