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

Dreamshield Discussion :

[Miles] Page personnalisée pour l'installation - Extensibilité


Sujet :

Dreamshield

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut [Miles] Page personnalisée pour l'installation - Extensibilité


    Petit tutoriel histoire de voir comment ça sort.
    A travers ce message, je vais vous expliquer comment faire une page personnalisée pendant l'installation pour demander des informations à l'utilisateur.
    Ce tutoriel n'est pas très bien écris, mais c'est plus un test pour la faisabilité de la chose.

    Tout d'abord vous aurez besoin de Miles, un micro-framework qui permet de faire des plugins très simplement pour DreamShield.
    Vous pouvez trouver la dll ainsi que ses sources à cette adresse :
    http://dreamshield.developpez.com/miles/miles.zip

    Créez un nouveau projet "Bibliothèque de contrôle utilisateur Windows".
    Rajoutez les références suivantes à votre projet :
    * Dans le dossier d'installation de DreamShield
    DreamShield.Data.dll
    DreamShield.Deployment.dll
    DreamShield.Extentions.dll
    DreamShield.IO.Utils.dll
    DreamShield.Luna.dll
    DreamShield.Windows.Themes.dll
    Pour toutes ces dlls, la propriété "copie locale" doit être à False
    * Dans l'archive Miles
    DreamShield.Deployment.Miles.dll
    La propriété "Copie locale" doit être à True

    Les informations de l'utilisateur seront rajoutés dans un fichier "Configuration.xml" que vous devez créer et rajouter à votre projet d'installation. Il ne contiendra que ce texte :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <InformationsXml>
    </InformationsXml>
    Créez une nouvelle classe "PluginEntry" et mettez le code suivant dedans (les explications sont données en commentaire) :
    Code c# : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    using System;
    using DreamShield.Extentions;
    using DreamShield.Deployment.Installers.DreamPlugins;
    using DreamShield.Deployment.Miles;
    using DreamShield.Deployment.Miles.CustomPage;
    using DreamShield.Deployment.Miles.IO;
    using System.IO;
    using System.Xml;
     
    namespace MilesCustomPage
    {
    	/// <summary>
    	/// Description of PluginEntry.
    	/// </summary>
    	[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid, "{77B51474-B088-4d40-ACD3-9B2F6450C466}")] /* GUID aléatoire ici */
    	public class PluginEntry : MilesRoot
    	{
    		protected override void OnServerInitialized()
    		{
    			base.OnServerInitialized();
     
    			/* page perso */
    			UserControl1 customPage = new UserControl1();
     
                            /* création d'un plugin de page perso */
    			CustomPagePlugin customPagePlugin = new CustomPagePlugin(Server,
    			                                           WizardPagesID.WelcomePage,
    			                                           true,
    			                                           "",
    			                                           customPage);
                            /* les deux appels suivants seront complétés dans le code de UserControl1 */
    			customPage.PagePlugin = customPagePlugin;
    			customPage.InitPlugin();
     
                            /* enregistrement du plugin */
    			Server.RegisterPlugin(customPagePlugin);
     
    			/* plugin de fichier */
                           /* il faudra intercepter l'installation du fichier Configuration.xml */
    			CustomFilesHandlerPlugin file_handler = new CustomFilesHandlerPlugin(Server);
    			Server.RegisterPlugin(file_handler);
     
                           /* Après l'installation du fichier */
    			file_handler.OnIOWorker_CreateFile_Done+= delegate(FileInfo file_info, ref string file_name) 
    			{
                                      /* On vérifie si le fichier est Configuration.xml */
    				if(file_info.Name.Equals("Configuration.xml"))
    				{
                                           /* on rajoute le nom de l'utilisateur */
    					XmlDocument doc = new XmlDocument();
    					doc.Load(file_info.FullName);
    					var root = doc.SelectSingleNode("InformationsXml");
    					var prop = doc.CreateElement("UserName");
    					prop.InnerText = (string)file_handler.GlobalInstallerVariables["user_name"]; /* propriété qui va contenir le nom de l'utilisateur */
    					root.AppendChild(prop);
    					doc.Save(file_info.FullName);
    				}
    			};
    		}
    	}
    }
    Et maintenant rajoutez un TextBox (nommé textBox1) au UserControl1 et modifiez le code de UserControl1 comme suit :
    Code c# : 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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    using DreamShield.Deployment.Miles.CustomPage;
     
    namespace MilesCustomPage
    {
    	/// <summary>
    	/// Description of UserControl1.
    	/// </summary>
    	public partial class UserControl1 : UserControl
    	{
    		public UserControl1()
    		{
    			InitializeComponent();
    		}
     
    		public CustomPagePlugin PagePlugin = null;
     
    		public void InitPlugin()
    		{
    			/* peut être utile, maintenant PagePlugin n'est pas nul */
    		}
     
    		void Button1Click(object sender, EventArgs e)
    		{
    			PagePlugin.GlobalInstallerVariables["user_name"] = textBox1.Text;
    		}
    	}
    }
    Compilez votre bibliothèque.
    Maintenant dans votre projet d'installation (qui contient Configuration.xml), allez dans l'exploration de projet, rubrique "Assemblies d'installation et plugins". Sous extentions faites un click droit puis "Nouvelle extention d'installation" et donnez lui un nom.
    Ensuite, comme Assembly principale naviguez vers votre assembly fraichement crée et dans la liste juste en dessous, faites un clique droit puis "Ajouter une assembly managée" et là rajoutez l'assembly DreamShield.Deployment.Miles.dll

    lancez votre projet et constatez
    J'attends vos retour

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Petit bonus : voici la documentation préliminaire de Miles au format chm :
    http://dreamshield.developpez.com/mi...umentation.zip
    Il n'y a pas grand chose à documenter, mais vu l'objectif visé par Miles je préfère prendre tout de suite la bonne direction.

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Mise à jour de miles (les liens de téléchargement de Miles et de la documentation sont toujours les mêmes).

    Au programme, deux nouvelles classes :
    - DreamShield.Deployment.Miles.CustomPage.StandardPages.PageVerifySerialNumber
    Une classe qui permet d'afficher une page "veuillez entrer le code" qui permet donc de demander à l'utilisateur un serial avant de continuer l'installation. La vérification du serial se fait par une interface que vous devez passer au constructeur et qui se chargera simplement de renvoyer un bool indiquant si le serial entré est correcte ou pas.

    DreamShield.Deployment.Miles.CustomPage.StandardPages.PageCollectUserInformations
    - Une page qui permet d'afficher un champ "Nom d'utilisateur" et "Mot de passe" pendant l'installation affin de demander à l'utilisateur de rentrer ses informations.

    Pour l'exemple d'utilisation, voici un plugin complet qui permet de demander un serial (qui dans l'exemple est simplement "serial" sans "), ensuite demander à l'utilisateur son nom et son mot de passe et qui enregistre ces informations dans un fichier Configuration.xml qui doit être inclus dans l'installation. Cette fois j'ai bien séparé les différents plugins pour gagner en clarté :

    Configuration.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0"?>
    <InformationsXml>
      <UserName></UserName>
      <UserPass></UserPass>
    </InformationsXml>

    Plugin :
    Code c# : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    using System;
    using DreamShield.Extentions;
    using DreamShield.Deployment.Installers.DreamPlugins;
    using DreamShield.Deployment.Miles;
    using DreamShield.Deployment.Miles.CustomPage;
    using DreamShield.Deployment.Miles.IO;
    using System.IO;
    using System.Xml;
    using DreamShield.Deployment.Miles.CustomPage.StandardPages;
     
    namespace MilesCustomPage
    {
    	/// <summary>
    	/// Description of UserPlugin.
    	/// </summary>
    	[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid, "{77B51474-B088-4d40-ACD3-9B2F6450C466}")]
    	public class UserPlugin : MilesRoot
    	{
    		protected override void OnServerInitialized()
    		{
    			base.OnServerInitialized();
     
    			RegisterSerialPage();
    			RegisterUserInfosPage();
    			RegisterConfigFileHandler();
    		}
     
    		public virtual void RegisterSerialPage()
    		{
    			PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
    			Server.RegisterPlugin(pg.Plugin);
    		}
     
    		public virtual void RegisterUserInfosPage()
    		{
    			PageCollectUserInformations pg = new PageCollectUserInformations(Server);
    			Server.RegisterPlugin(pg.Plugin);
    		}
     
    		public virtual void RegisterConfigFileHandler()
    		{
    			CustomFilesHandlerPlugin file_handler = new CustomFilesHandlerPlugin(Server);
    			Server.RegisterPlugin(file_handler);
     
    			file_handler.OnIOWorker_CreateFile_Done+= delegate(FileInfo file_info, ref string file_name) 
    			{
    				if(file_info.Name.Equals("Configuration.xml"))
    				{
    					XmlDocument doc = new XmlDocument();
     
    					doc.Load(file_info.FullName);
     
    					var root = doc.SelectSingleNode("InformationsXml");
     
    					root.SelectSingleNode("UserName").InnerText = (string)file_handler.GlobalInstallerVariables["user_name"];
    					root.SelectSingleNode("UserPass").InnerText = (string)file_handler.GlobalInstallerVariables["user_password"];
     
    					doc.Save(file_info.FullName);
    				}
    			};
    		}
    	}	
    }

    Vérification du serial :
    Code c# : 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
     
    using System;
    using DreamShield.Deployment.Miles.CustomPage.StandardPages;
     
    namespace MilesCustomPage
    {
    	/// <summary>
    	/// Description of SerialVerificationClass.
    	/// </summary>
    	public class SerialVerificationClass : PageVerifySerialNumber.IPageVerifySerialNumber_Validator
    	{
    		public SerialVerificationClass()
    		{
    		}
     
    		public bool CanContinueWithSerial(string serial)
    		{
    			return serial == "serial";
    		}
     
    		public void SerialAccepted(string serial)
    		{
     
    		}
    	}
    }
    Bien entendu, une méthode plus évoluée peut être placée dans CanContinueWithSerial. La documentation de cette interface est dans la documentation de Miles.

    Pour compiler/inclure le plugin dans votre installation, reportez vous au premier message. Voilà, enjoy !

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Re-mise à jour de Miles, toujours avec les mêmes liens de téléchargement.

    Un vrai tutoriel est désormais disponible. Il décrit les pages personnalisées mais pas encore l'interception de l'installation de fichiers. Il est disponible sur le wiki de DreamShield ici :
    http://dreamshield.developpez.com/do...p?n=Main.Miles

    Il y a également une nouvelle classe dans Miles, PageSetupSplash, qui permet d'afficher une image comme première page de l'installation. Son utilisation est décrite dans le tutoriel précédemment cité.

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bêta
    Nouvelle version de Miles conçue pour la Bêta de la prochaine version de DreamShield, téléchargeable ici.
    Cette version de Miles a été pour l'occasion disposée à cette adresse.

    La grande nouveauté de cette version est l'ajout d'outils spécialement dédiés à la création de mises à jour automatiques. Voici une présentation rapide permettant de réaliser des mises à jour automatiques pour n'importe quelle application .NET déployée avec DreamShield.

    Projet d'installation
    - Tout d'abord vous devez utiliser la bêta de DreamShield Update 1, téléchargeable via le lien cité plus haut
    - Miles utilise DreamShield's Live Update v 2.0 que vous devez redistribuer à votre projet. Pour cela, dans votre projet vous devez vous rendre dans la rubrique Données du package > Edition des modules partagés puis sélectionnez le composant par défaut, faites un clique droit sur la liste à droite puis "Ajouter un module" et choisissez le fichier DreamShield's LiveUpdate.ddmerge situé dans le dossier d'installation de DreamShield, sous dossier Redist\Merge Modules (Dans le cas par défaut, c'est donc C:\Program Files\LKSoft\DreamShield Applications\Redist\Merge Modules).
    Une fois rajouté, modifiez la propriété "Mode d'inclusion" (en bas) pour spécifier la valeur "External".
    - Vos applications vont maintenant s'installer avec DreamShield's LiveUpdate. Le dernier point est qu'il vous faut utiliser l'outil de publication pour que les mises à jour soient détectées (cf. rubrique Outils de publication > Assistant de publication).

    Application
    - Décompressez l'archive Miles pour la bêta (lien de téléchargement plus haut) dans un dossier, et rajoutez une référence vers "\DreamShield.Deployment.Miles.ApplicationUtils\bin\Debug\DreamShield.Deployment.Miles.ApplicationUtils.dll" et spécifiez de copier cette référence vers la sortie. En d'autres termes, il faudra redistribuer avec votre application (et mettre dans le dossier de votre exécutable) les dll
    • DreamShield.Deployment.Miles.ApplicationUtils.dll
    • DreamShield.UpdateCheckerApplication.Starter.dll


    Et voilà, maintenant il vous suffit de rajouter
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    using DreamShield.Deployment.Miles.ApplicationUtils;
    Et d'utiliser le code en fonction de vos envies. Notez qu'à chaque fois GUID_DE_VOTRE_APPLICATION et le Guid de votre produit, dans les options de votre projet d'installation, et l'Url de publication correspond à l'url complète à laquelle obtenir votre application. Ie. si votre application est déployée sur le serveur ftp://www.exemple.com/machin/truc et que le serveur de téléchargement est http://www.exemple.com/wwwroot, alors l'url sera http://www.exemple.com/wwwroot/machin/truc

    Vérifier si votre application est bien installée
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    InstalledApplicationManager.IsInstalledApplication(new Guid("GUID_DE_VOTRE_APPLICATION"));

    Obtenir la version de DreamShield's LiveUpdate (elle doit être 2 minimum pour utiliser Miles)
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    InstalledApplicationManager.GetInstalledLiveUpdateVersion()

    Initialiser Miles pour votre produit
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InstalledApplicationManager installedApplication = new InstalledApplicationManager(
                    new Guid("GUID_DE_VOTRE_PRODUIT"));

    Vérifier si une nouvelle mise à jour est disponible pour votre produit
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string publishUrl = "url de publication";
    return installedApplication.HasUpdatesAvailable(publishUrl, true);
    (le true spécifie qu'il faut afficher un petit tooltip dans la zone de notification pour dire qu'une recherche de mise à jour est en cours, false si vous n'en voulez pas).

    Installer les mises à jour disponibles
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    installedApplication.InstallUpdates(publishUrl, false, false);

    Enfin, la procédure normale de mise à jour est la suivante :
    - Vérifier si l'application est bien installée (erreur sinon)
    - Vérifier si DreamShield's LiveUpdate 2 ou plus est bien installé (erreur sinon)
    - Vérifier si des mises à jour sont disponibles
    - Si des mises à jour sont disponibles, demander à l'utilisateur s'il veux les installer
    - Si l'utilisateur est d'accord, lancer la procédure InstallUpdates et quitter l'application pour laisser les mises à jour s'installer.

    Le dernier point est possible car les mises à jour ne sont pas exécutée dans le même processus que l'application en cours. Donc une fois que vous avez lancé InstallUpdates, votre application continue de s'exécuter pendant la recherche des mises à jour mais pour éviter de verrouiller les fichiers à installer de sorte que l'installeur soit obligé de redémarrer l'ordinateur, il faut fermer l'application à mettre à jour.

    Voilà voilà.

Discussions similaires

  1. [SP-2007] Pages personnalisées pour les erreurs HTTP
    Par GreenFlag dans le forum SharePoint
    Réponses: 1
    Dernier message: 06/06/2014, 16h11
  2. Réponses: 0
    Dernier message: 27/09/2012, 11h45
  3. [SP-2010] Master page personnalisée non visible pour des utilisateurs
    Par Gond63 dans le forum SharePoint
    Réponses: 1
    Dernier message: 26/04/2011, 17h32
  4. Page personnalisée pour fonction die()
    Par gloubi dans le forum Langage
    Réponses: 3
    Dernier message: 23/02/2008, 02h17
  5. Réponses: 3
    Dernier message: 19/10/2007, 14h32

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