Voici un module PowerShell permettant de créer un fichier .ps1xml dédié aux méthodes d'extension contenues dans un fichier assembly dotnet.
Comme votre projet en propose de nombreuses, je me suis dit qu'il serait bien de faciliter leurs usage sous PowerShell.
Sous Powershell V1 et V2 on ne peut pas utiliser celles dont le type de this est :
Quelques exemples :
- un type générique, car le système d'extension de type de PowerShell nécessite de préciser des noms de type fort pour chaque paramètrage de la classe générique,
- un type interface, car PowerShell ne sait pas nativement 'extraire' une interface particulière à partir d'un objet. De plus le pipeline de PowerShell 'transforme' les objets de type IEnumerable en System.Array.
Pour 'System.Core' la recherche ne renvoi rien, car LINQ est conçu autour de classes génériques et d'interfaces.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $PathAsm="G:\temp\dvp.net-0.2-beta\Binaries" Import-Module "G:\PS\ExtensionMethod\ExtensionMethod.psm1" -force #Charge et retrouve les méthodes d'extension d'un assembly # qui n'est pas dans le GAC $Result=Add-Type -Path "$PathAsm\Developpez.Dotnet.dll" -Pass| Find-ExtensionMethod -ExcludeGeneric
Récupère dans une hastable les informations sur les méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #Charge et retrouve les méthodes d'extension d'un assembly du GAC #On charge le namespace Linq du framework 3.5 $Result=Add-Type -assemblyname "System.Core" -Pass| Find-ExtensionMethod -ExcludeGeneric | #Recupère les informations des méthodes d'extension. Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface
Affiche sur la console,à l'aide d'un 'wrapper' sur le cmdlet Format-Table, la liste des méthodes d'extension regroupées par type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $H=Add-Type -Path "$PathAsm\Developpez.Dotnet.dll" -Pass| Find-ExtensionMethod -ExcludeGeneric| Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface| #Crée une hashtable regroupant les méthodes d'extension par type. New-HashTable -key "Key" -Value "Value" -MakeArray $H."System.IO.TextReader"
L'objectif du module, générer un fichier d'extension de type (fichier .ps1xml) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Add-Type -Path "$PathAsm\Developpez.Dotnet.dll" -Pass| Find-ExtensionMethod -ExcludeGeneric| Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface| New-HashTable -key "Key" -Value "Value" -MakeArray| #Affiche le détail des méthodes d'extension trouvées Format-TableExtensionMethod
Et enfin, dans la session courante, chargement et signature si nécessaire, du fichier d'extension de type généré :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $TypesFileName="DateTimeExtensionMethod.Types.ps1xml" Add-Type -Path "$PathAsm\Developpez.Dotnet.dll" -Pass| #filtre sur le namespace # Where {$_.Namespace -eq "Developpez.Dotnet.Reflection"} | Find-ExtensionMethod -ExcludeGeneric| Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface| New-HashTable -key "Key" -Value "Value" -MakeArray| #Crée un texte représentant une structure XML que # l'on insére dans un fichier de type PowerShell. New-ExtensionMethodTypeData > $TypesFileName
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Type $TypesFileName|More #Si la stratégie d'exécution est 'AllSigned' if (Get-ExcecutionPolicy -eq "AllSigned" ) { #Signe $TypesFileName } #Met à jour la configuration de type étendu (ETS) Update-TypeData $TypesFileName #usage $dt=Get-Date $dt.AddDays(1).Next("Sunday") # renvoi : # dimanche 8 août 2010 16:07:54
Partager