Convert-Form
D’après une idée originale de Jean-Louis, Robin Lemesle et Arnaud Petitjean. La version d’origine a été publiée sur le site PowerShell-Scripting.com.
Je tiens à remercier Sébastien Doeraene pour son aide sur les expressions régulières.
Testé avec PowerShell V1 sous Windows XP et PowerShell V2 sous Windows Seven RTM.
Cet ensemble de scripts permet de convertir les déclarations de création d’une WinForm C# en un script PowerShell. Le fichier source est un fichier xxx.Designer.cs, créé à l’aide de Visual Studio (toutes versions, 2005 ou 2008).
Vous pouvez télécharger la version gratuite de Visual C# 2008 Express SP1 ici: http://msdn.microsoft.com/fr-fr/express/aa975050.aspx
Sommaire
- Contenu
- Installation des scripts
- Convertir un fichier Winform
- Comment répercuter les modifications du fichier Designer
- Coder les événements des composants graphiques
- Installer le cmdlet Invoke-Apartment
Installation des scripts¶
Soit vous utilisez la distribution du projet Add-Lib, soit vous recopiez uniquement les fichiers du répertoire ...\PowerShell\Add-Lib\Scripts\Convert-Form vers un répertoire de votre choix, dans ce cas recopier y également le script PackageScripts.
Pour afficher le détail des paramètres du script Convert-Form.ps1 :
.\Convert-From|more
Convertir un fichier Winform¶
Pour exécuter le script dans une console PowerShell, vous pouvez
-soit vous vous placez dans le répertoire du projet Winform
cd C:\VisualStudioPath\ProjetPath .\Convert-Form Form1.Designer.cs Form1.ps1Si vous précisez les deux noms de fichier le premier référence le fichier de la Form, le second le fichier .PS1 généré.
-soit vous vous placez dans le répertoire dans lequel vous souhaitez crée le fichier
cd C:\temp\test
.\Convert-Form C:\VSPath\ProjetPath\Form1.Designer.cs Form1.ps1
Pour afficher le détail des paramètres du script Convert-Form.ps1
.\Convert-Form|More
Une fois le script généré (Form1.ps1), exécutez-le et corrigez les erreurs éventuelles. Il peut y en avoir, car bien que de nombreux objets graphiques soient supportés tous les cas d’utilisation de leurs propriétés n’ont pas été testés. La syntaxe du script est vérifiée lors de la création, mais elle ne garantit pas l’exécution correcte du script.
Comment répercuter les modifications du fichier Designer¶
Un projet Winform ne se crée pas en une seule opération, dans le cas où vous modifierez votre projet Winform vous serez amené à régénérer un script PowerShell.
Le problème maintenant est de reporter les modifications de ce nouveau script dans l'ancien script, pour ce faire l'outil gratuit WinMerge vous facilitera la tâche.
Pensez toutefois à ne pas utiliser le switch –Force ou à préciser un nouveau nom différent de script de l’ancien.
Par exemple la recopie d’écran suivante affiche la différence entre les deux versions d’un script utilisant le même projet Winform. Les nouvelles lignes concernant l’ajout d’un nouveau bouton peuvent facilement être répercutées du nouveau script vers l’ancien.
Code couleur des messages d'erreur¶
Messages d’erreur¶
Convert-Form.ps1Message | Cause | ||
---|---|---|---|
Le fichier source n'existe pas | Le fichier form1.designer.cs n’existe pas ou le chemin est erroné. | Le script suivant n'existe pas |
Un script secondaire, mais nécessaire est introuvable. |
Opération abandonnée | Vous avez choisi de ne pas écraser le fichier destination existant. | ||
Les méthodes de thread du composant BackgroundWorker ne peuvent fonctionner sous PowerShell V1.0 | La form en cours de conversion contient un composant qui ne peut être supporté. | ||
Le nom de la form est introuvable dans le fichier xxx. La conversion ne peut s'effectuer | Le fichier xx.designer.cs ne semble pas respecter la syntaxe attendue. |
Message | Cause |
---|---|
Le générateur de ressources est introuvable | Le programme ResGen.exe est introuvable. |
Le fichier de ressources n'existe pas | Le fichier contenant les ressources utilisées par un composant est introuvable. |
Suppression du fichier impossible | Un fichier de log existant ne peut être supprimé. |
Erreur(xx) lors de la génération du fichier de ressources. Consultez le fichier de log | L’exécution du programme ResGen.exe a provoqué une erreur. |
Cas imprévu | Erreur interne d’analyse, poster un message dans le forum. |
Message | Cause |
---|---|
Xxxx introuvables. Le traitement ne peut continuer | Un élément nécessaire à l’exécution du script est introuvable. Ce peut être un cmdlet, un script ou encore une fonction. |
Le tableau contenant les noms d'éléments à rechercher ne peut être null ou vide | Erreur interne d’analyse, poster un message dans le forum. |
Message | Cause |
---|---|
Le fichier suivant n'existe pas | Votre script utilise un fichier de ressources qui est introuvable. |
Coder les événements des composants graphiques¶
Création d’un gestionnaire d’événement¶
Voici la déclaration de la signature d’une fonction gérant un événement d’une WinForm :
function OnFormClosing_Form1()
Dans la portée du code de la fonction le paramètre $this est égal au paramètre sender (object) du C#. Il référence l’objet déclenchant l’événement.
Le paramètre $_ est égal au paramètre e (eventarg) du C#. Il contient des informations sur l’événement déclenché.
L’appel par le gestionnaire d’événement d’un composant, de la fonction gérant cet événement se fait de la manière suivante :
$Form1.Add_FormClosing( { OnFormClosing_Form1} )
OnFormClosing_Form1 est le nom de la fonction à appeler. On ne renseigne aucun paramètre puisque PowerShell considère cette fonction comme respectant la signature du délégué de l’événement.
Dans la fonction OnFormClosing_Form1 la variable $this, sera égale à $Form1 et la variable $_ contiendra un objet descendant de la classe Eventargs.
Installer le cmdlet Invoke-Apartment¶
Certains composants graphiques ne fonctionnent pas sous PowerShell, car celui-ci utilise le modèle de thread MTA. Une WinForm utilise par défaut le modèle de thread STA.
On doit donc modifier le modèle de thread de PowerShell à l’aide d’un cmdlet nommé Invoke-Apartment. Si vous utilisez les cmdlets du projet open source PSCX v1.2, vous n’aurez pas besoin d’installer le cmdlet lié au projet Add-Lib.
Pour installer ce cmdlet, effectuer dans l'ordre les opérations suivantes :
Set-Alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil.exe Cd "$($AddLib.Root)\Applications\Cmdlets\Invoke-Apartment" installutil PSInvokeApartment.dll Get-PSSnapin -registered Add-PSSnapin InvokeApartmentSample # à insérer dans le profile utilisateur Get-Command Invoke-Apartment #Usage [void][reflection.assembly]::loadwithpartialname("System.Windows.Forms") $Texte = invoke-apartment "STA" "[windows.forms.clipboard]::GetText()" #Récupère une string $Texte #Récupère un tableau de string $ArrayString=$Texte.Split("`n")
Le script de configuration du projet Add-Lib prend uniquement en charge le chargement du snapin.
voir le fichier :
RépertoireD'installation\Add-Lib\Profile\Add-LibConfig.ps1