2017-06-01 2 views
-1

Essayer d'attraper quand l'écran est verrouillé et trouver un extrait de C# qui semble l'accomplir, mais chaque fois que j'essaie d'incorporer dans PowerShell, je reçois quelques différentes erreurs:Erreur lors de l'exécution de C# à partir de PowerShell: jeton 'using' invalide dans

$Assemblies = @('System', 'System.Messaging') 

$type = @" 
using System; 
using System.Messaging; 

public class Win32Session 
{ 
    private const int NOTIFY_FOR_THIS_SESSION = 0; 
    private const int WM_WTSSESSION_CHANGE = 0x2b1; 
    private const int WTS_SESSION_LOCK = 0x7; 
    private const int WTS_SESSION_UNLOCK = 0x8; 

    public event EventHandler MachineLocked; 
    public event EventHandler MachineUnlocked; 

    public Win32Session() 
    { 
     ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage; 
    } 

    void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled) 
    { 
     if (msg.message == WM_WTSSESSION_CHANGE) 
     { 
      int value = msg.wParam.ToInt32(); 
      if (value == WTS_SESSION_LOCK) 
      { 
       OnMachineLocked(EventArgs.Empty); 
      } 
      else if (value == WTS_SESSION_UNLOCK) 
      { 
       OnMachineUnlocked(EventArgs.Empty); 
      } 
     } 
    } 

    protected virtual void OnMachineLocked(EventArgs e) 
    { 
     EventHandler temp = MachineLocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 

    protected virtual void OnMachineUnlocked(EventArgs e) 
    { 
     EventHandler temp = MachineUnlocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 
} 
"@ 

Add-Type -MemberDefinition $type -Name 'Eventing' -ReferencedAssemblies $Assemblies 

... si je laisse les « déclarations » à l'aide de l'ici-chaîne, je reçois une erreur sur « en utilisant » étant un jeton non valide. Si je supprime les instructions 'using' et que je les relance, le compilateur se plaint de ne pas savoir quel est le type MSG. Quelqu'un peut-il aider? THX!

+0

Les utilisations sont invalides (c'est ce que '-ReferencedAssemblies' est là pour). Je ne sais pas non plus quel est le type MSG - il n'est défini dans aucun des assemblages référencés. – Adrian

+0

@Adrian Le référencement d'un assembly n'est pas la même chose que l'ajout d'une directive 'using' dans un fichier .cs. –

+0

@EdPlunkett true, bien qu'il s'agisse d'un fichier PowerShell et non d'un fichier C#. J'ai ajouté une réponse avec de meilleures informations. – Adrian

Répondre

2

Vous pouvez utiliser le code -UsingNamespace parameter pour servir l'objectif d'une directive using dans un fichier C#. Toutefois, le type MSG semble être indéfini dans les espaces de noms référencés.