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

Scripts/Batch Discussion :

Problème d'assembly depuis un objet [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut Problème d'assembly depuis un objet
    Bonjour à tous
    Je suis confronté au problème d'appel des "assembly" depuis des objets.

    Un exemple parlant bien plus que des mots, je vous présente une portion de code qui résume à lui tout seul mon problème

    Code PowerShell : 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
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    Class W_Dialog {
        # Classe de gestion de l'affichage d'une fenêtre type PopUp
        # =========================================================
        # Propriétés
        [String] $titre = ""
        [String] $texte = ""
        [Int] $icone = 0 # 0 : Aucune icône | 16 : Erreur | 32 : Question | 48 : Avertissement | 64 : Information 
        [Int] $bouton = 0 # 0 : OK | 1 : OKCancel | 2 : AbortRetryIgnore | 3 : YesNoCancel | 4 : YesNo | 5 : RetryCancel
        [String] $reponse = ""
        # Méthodes
        Create() { # Création et affichage de la fenêtre de type PopUp
            $this.reponse = [System.Windows.Forms.MessageBox]::Show($this.texte, $this.titre,$this.bouton,$this.icone)
        }
    }
     
    [W_Dialog] $msgbox = @{'titre' = "Information"; 'texte' = "Ceci est un test"; 'bouton' = 0; 'icone' = 32;}
    $msgbox.Create()

    Quand je lance mon script, j'ai un beau message d'erreur m'indiquant qu'il ne trouve pas System.Windows.Forms.MessageBox alors que je l'ai déclaré au tout début de mon script.

    Si je crée un second script
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    Et que je le lance dans une console PS, puis qu'ensuite je lance mon script initial dans cette même console PS, cela fonctionne.
    Où est ce que je pêche ? Comment dois je permettre à PowerShell de prendre en compte mes déclarations d'assembly ?
    Ma seule contrainte non négociable est de ne posséder qu'un seul fichier PS1, pour une très grande portabilité (pas de module d'auto-chargement ou autre à placer dans d'autres répertoires).

    Je vous remercie d'avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Il semble que ce soit ta classe W_Dialog qui masque les type ajoutés.
    Je ne sais pas trop pourquoi car je n'utilise pas souvent les Class en powershell je découvre donc le phénomène.
    Mais c'est intéressant

    Il en parle ici :
    https://stackoverflow.com/questions/...37458#34637458
    https://stackoverflow.com/questions/...37458#34637458
    https://github.com/PowerShell/PowerS...ment-297151112
    https://github.com/PowerShell/PowerShell/issues/6652


    Ps : Essaie d'utiliser les bon types
    Ps : Lors de l'utilisation du splatting les variables ne sont pas entre-coté

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Si ça peux t'aider à comprendre ceci fonctionne

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Add-Type -AssemblyName System.Windows.Forms
     
    Invoke-Expression @‘
    Class W_Dialog {
        Create()
        {
            [System.Windows.Forms.MessageBox]::Show("texte", "titre")
        }
    }
    '@
     
    [W_Dialog]::new().Create()

  4. #4
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut
    Bonjour Eric
    Merci pour ta réponse très claire, elle répond très bien à ma problématique !
    Je vais donc m'orienter vers cette solution.
    Pour répondre à ta remarque concernant la mise entre quotes de mes clefs dans les [HashTable], c'est surtout parce que j'utilise souvent des nombres au format chaine de caractères pour les définir. Ce n'est vraisemblablement pas la bonne méthode, mais elle me permet de mieux déboguer mes scripts au prompt.

    Je clos donc le sujet.

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Oui enfin c'est claire sans vraiment l'être, si quelqu'un de plus calé à une réponse plus précise sur ce comportement et contournement possible je suis preneur

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par ericlm128 Voir le message
    Oui enfin c'est claire sans vraiment l'être, si quelqu'un de plus calé à une réponse plus précise sur ce comportement et contournement possible je suis preneur
    Je ne sais si je suis plus 'calé' mais j'ai qq infos sur le sujet.
    Comme il est dit dans les posts que tu as cités, le parseur Powershell traite d'abord les définitions de classes puis traite les autres instructions du script.
    On a donc ce comportement déroutant qui fait que les instructions que l'on lit séquentiellement ne sont pas exécuté dans l'ordre.
    Il est recommandé d'utiliser un module pour déclarer des classes, bien que d'autres problèmes surviennent dans ce cas.

    Il est préférable d'éviter l'usage du cmdlet Invoke-expression.

    Il existe un cas où une classe PS peut en masquer une autre, si elle porte le même nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Add-type -TypeDefinition @'
       public class Test
       {
           public string Name;
       }
    '@
    Class Test { [Int] $Name;}
    Pour info :
    De : Jason Shirk (POWERSHELL)
    Envoyé : vendredi 18 septembre 2015 17:27
    Objet : RE: [PSMVP] Powershell classes hidde dotnet classes ?

    - Is it by design that the existing Powershell classes hidde dotnet classes ?

    Yes, PowerShell classes are defined in their own assembly (one per script/module) and each assembly can define types with the same name.
    This may be useful for mocking.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/04/2006, 12h29
  2. Problème d'assembly
    Par SkYsO dans le forum Delphi .NET
    Réponses: 12
    Dernier message: 14/11/2005, 08h24
  3. [JDBC]Problème Accent MySQL depuis DB browser dans eclipse
    Par chpruvos dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 26/08/2005, 14h14
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. [C#] Problème pour l'appel d'objet...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 09h59

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