Projet

Général

Profil

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

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.ps1
Si 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.ps1
Message 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.
PackageConvert-Form.ps1
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.
PackageScripts.ps1
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.
votreScriptDeDestination.ps1
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

Limites et composants supportés