1. #1
    Rédacteur


    Profil pro
    Inscrit en
    janvier 2003
    Messages
    6 822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 822
    Points : 15 133
    Points
    15 133
    Billets dans le blog
    1

    Par défaut Module PowerShell pour les méthodes d'extension

    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 :
    • 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.
    Quelques exemples :
    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
    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
     #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
    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
    $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"
    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
    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
    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
    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
    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
    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
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 829
    Points : 40 602
    Points
    40 602

    Par défaut

    Super, merci

    Citation Envoyé par Laurent Dardenne Voir le message
    Sous Powershell V1 et V2 on ne peut pas utiliser celles dont le type de this est :
    • 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.
    Arf... ça c'est pas cool, surtout que la plupart des méthodes d'extension de la lib sont basées soit sur des interfaces, soit sur des génériques (voire les 2)

    Tu sais si ce sera supporté dans les versions suivantes ?

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    janvier 2003
    Messages
    6 822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 822
    Points : 15 133
    Points
    15 133
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par tomlev Voir le message
    Arf... ça c'est pas cool, surtout que la plupart des méthodes d'extension de la lib sont basées soit sur des interfaces, soit sur des génériques (voire les 2)
    Du coup le nombre de celles restantes est limitées, mais elles restent intéressantes.
    Citation Envoyé par tomlev Voir le message
    Tu sais si ce sera supporté dans les versions suivantes ?
    Aucune info !
    La v2 a améliorée la prise en charge des génériques, concernant l'adaptation de type (ETS) l'équipe de PowerShell a peut être jugé que cela n'était pas prioritaire.
    C'est surtout la communauté des développeurs qui "pousse" pour que ce shell offre une meilleure prise en charge de la POO, puisque l'automatisatoon de tâche ne concerne pas que l'infrastructure.
    Dans la doc de la release de la v2 il est fait mention de mot clés réservés pour la création de classe :
    • Reserved keywords and parameter names
    Windows PowerShell 2.0 has reserved the following keywords and parameter names. Using these keywords and parameter names for other purposes might cause errors.
    o Reserved language keywords: USING, CLASS, DEFINE, and VAR
    o Reserved parameter names: –SelectProperty and –SelectObject
    Je suppose leur modéle de conception assez riche étant donné que la v2 a su évoluer sans rien remettre en cause.
    On peut supposer que ces points seront pris en charge dans la prochaine version, avec la prochaine CTP on sera fixé.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/02/2014, 16h46
  2. [POO] Organisation classe pour les méthodes PDO
    Par altair8080 dans le forum Syntaxe
    Réponses: 1
    Dernier message: 24/12/2013, 11h33
  3. Quels modules Perl pour gérer les documents XML ?
    Par djibril dans le forum Modules
    Réponses: 8
    Dernier message: 02/12/2010, 23h54
  4. Question pour les méthodes de string
    Par 0ColdZero0 dans le forum C++
    Réponses: 3
    Dernier message: 23/04/2009, 21h33

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