Résolu Interface graphique avec PS v7

Plus d'informations
il y a 5 mois 1 semaine - il y a 5 mois 1 semaine #32398 par Guillaume
Bonjour,
J'utilise actuellement un script PowerShell (en version 5.1) avec une interface graphique WPF/XAML (créée sur VS 2017). Je souhaiterais passer en version 7.2. Evidemment, quand j'essaye de lancer mon script, ça plante joliment.
Code :
$Global:Affichage = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Interface))
Erreur générée :
MethodInvocationException: Exception calling "Load" with "1" argument(s): "La propriété Set 'System.Windows.FrameworkElement.Name' a levé une exception."

J'ai lu qu'il pouvait y avoir des problématiques avec certains modules, les classes .Net, etc. Mon script fonctionne très bien si je reste sur la version 5.1 mais j'aimerais commencer à le "migrer" tant qu'il n'y a pas d'urgence de mon côté pour le faire.
Ma question est : Faut-il seulement adapter un morceau de code pour que ça marche ou faut-il fonctionner complètement différemment ? Je suis ouvert à tous les scénarios.
Merci d'avance pour vos retours.
Guillaume
Dernière édition: il y a 5 mois 1 semaine par Guillaume.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 mois 1 semaine - il y a 5 mois 1 semaine #32400 par Laurent Dardenne
Salut,
il faut le détail de l'exception.
J'ai une appli codé en 5.1 qui fonctionne avec PowerShell 7.2.0.
Enfin je n'ai pas d'erreur au chargement du XAML, car je n'ai pas fait de test du code PS qui doit avoir des breaking change.
Ton XAML est à contrôler je pense, un composant n'est peut être plus supporté.

>>J'ai lu qu'il pouvait y avoir des problématiques avec certains modules, les classes .Net,
Il faut étudier au cas par cas et certaines API existent mais avec d'autres noms ou d'autres manières de faire.
Dans ton cas assure toi que ce que tu utilises est possible avec la version 7.2.
Un exemple de frein à une migration : docs.microsoft.com/en-us/powershell/sccm...powershell-version-7

Regarde ceci : github.com/PowerShell/whatsnew
Presque tous les breaking change sont indiqués sur le repo de PS 7

Tutoriels PowerShell
Dernière édition: il y a 5 mois 1 semaine par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 mois 1 semaine - il y a 5 mois 1 semaine #32401 par Guillaume
Réponse de Guillaume sur le sujet Interface graphique avec PS v7
Bonjour,
Merci pour ton retour. Nous n'utilisons pas SCCM pour l'instant. J'ai l'impression que c'est avant la lecture du XAML. Ceci dit, comme je n'en suis pas certain, voici comment débute mon fichier XAML :
<Window Name="Administration"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Tout ce qui suit après est purement design.

Voici plus de détails sur les erreurs au lancement du script :
# IMPORT DES FRAMEWORK ASSEMBLIES
Try { Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,System.Windows.Forms,System.IO,System.Reflection }
Catch { Throw "Echec de chargement des Windows Presentation Framework Assemblies." }

# IMPORT DES FICHIERS XAML
[XML]$Global:Interface = Get-Content -Path 'C:\Users\user\Documents\Administration\Powershell\Administration\Admin_SI.xaml'

# CREATION DE L'INTERFACE GRAPHIQUE
$Global:Affichage = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Interface))
Résultat :
Fichier attaché :
https://ibb.co/wKRVLYK
Du coup, je me suis dit, je vais ajouter "System.Xml.XmlNodeReader" à la liste des Assemblies, ce qui donne :
# IMPORT DES FRAMEWORK ASSEMBLIES
Try { Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,System.Windows.Forms,System.IO,System.Reflection,System.Xml.XmlNodeReader }
Catch { Throw "Echec de chargement des Windows Presentation Framework Assemblies." }
Résultat :
Fichier attaché :

J'ai supposé donc que "System.Xml.XmlNodeReader" n'est pas compatible avec la version Core.
Je viens de relire la 1ère erreur et cette partie m'interpelle :
Fichier attaché :

C'est issu d'un module que j'ai téléchargé pour une de mes fonctions : BuildDialog.psm1.
Ci-dessous, le contenu du module (la ligne encadrée en vert est la n°52) :
Attention : Spoiler !


Pour information, j'utilise ce module pour pouvoir sélectionner un dossier via l'interface Windows. J'utilise "New-Object System.Windows.Forms.OpenFileDialog" pour pouvoir sélectionner un fichier mais il n'est pas possible (du moins quand j'ai créé cette fonction) de sélectionner un dossier. D'où l'ajout de ce module. S'il existe une possibilité de faire sans ce module, je prends !
Dernière édition: il y a 5 mois 1 semaine par Guillaume.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 mois 1 semaine - il y a 5 mois 1 semaine #32402 par Laurent Dardenne
>>Nous n'utilisons pas SCCM pour l'instant.
C'était un exemple d'incompatibilté selon les modules utilisés.

>>J'ai l'impression que c'est avant la lecture du XAML.
A priori c'est la méthode load comme indiqué: MethodInvocationException: Exception calling "Load" . Une possible raison .
Et pour ceci :
Catch { Throw "Echec de chargement des Windows Presentation Framework Assemblies." }

Bah faut pas le faire ;-)
C'est l'appelant qui gère les exceptions et ici on perd la pile d'appel et l'origine de l'exception, c'est mal parti pour débuger..
Ensuite d'enregistrer l'exception sur disque ( $_|Export-Clixml "FileSystem::$xmlFile") permet d'avoir tous les détails hors contexte et on peut la recharger à volonté.

Là où je suis je ne peux consulter les images de ton post.
Mais essaie déjà en dehors de ton script de charger le xaml dans une console, tu pourras éliminer des suppositions. Sinon le debuger de VsCode, et élimine les pb d'encodage. PS v7 à modifier qq api sur ce point il me semble, regarde cette extension: marketplace.visualstudio.com/items?itemName=nhoizey.gremlins

Enfin, je dois prendre le temps de lire et tester le code C#.

Tutoriels PowerShell
Dernière édition: il y a 5 mois 1 semaine par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 mois 1 semaine #32403 par Laurent Dardenne
Pour le code C# le site a peut-être modifié le code à ton insu :
Ceci ne compile pas ", params object parameters)"

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 5 mois 1 semaine #32408 par Guillaume
Réponse de Guillaume sur le sujet Interface graphique avec PS v7
Concernant le module BuildDialog, j'ai trouvé hier après-midi que la fonction pour laquelle j'avais ajouté ce module existe en version Core. Je l'ai testée à part et ça fonctionne donc je pense que je vais pouvoir me passer du module. Je pense qu'on peut donc "oublier" ce problème.
Par contre, je galère toujours avec l'appel de mon XML principal. Il y a trois fichiers XML et seul celui nommé "Interface" ne se lance pas...
# IMPORT DES FICHIERS XAML
[XML]$Global:Interface = Get-Content -Path 'C:\Users\user\Documents\Administration\Powershell\Administration\Interface.xaml'
[XML]$Global:Chargement = Get-Content -Path 'C:\Users\user\Documents\Administration\Powershell\Administration\Chargement.xaml'
[XML]$Global:Parametres = Get-Content -Path 'C:\Users\user\Documents\Administration\Powershell\Administration\Parametres.xaml'

# CREATION DE L'INTERFACE GRAPHIQUE
$Global:Affichage = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Interface))
$Global:Affichage2 = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Chargement))
$Global:Affichage3 = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Parametres))

Pour info, voici les en-têtes de mes fichiers XAML :
<Window x:Name="Interface"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
<Window x:Name="Chargement"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
<Window x:Name="Parametres"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Aucun souci quand je lance ça avec PS 5.1. Je ne sais pas comment débugger ce souci. Est-ce qu'il y aurait des éléments XAML qui ne seraient pas gérés par PS v7 ?
Si c'est plus simple pour toi, je peux t'envoyer les fichiers XAML.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.073 secondes
Propulsé par Kunena