Partager via


Exécution de méthodes sur des objets de gestion

Les objets de gestion contiennent des propriétés qu'il est possible de lire et de modifier, et peuvent également exposer des méthodes qu'une application de gestion cliente peut appeler. Par exemple, un objet disque peut exposer une méthode « format », ou un objet service peut avoir des méthodes « démarrage » et « arrêt ». L'exemple suivant montre le code permettant d'appeler une méthode sur un objet de gestion. Dans ce cas particulier, la méthode est statique et est appelée sur la classe elle-même, alors que les méthodes sont généralement appelées sur des instances.

using System;
using System.Management;

public class InvokeMethod {

    public static void Main() {

      //Get the object on which the method will be invoked
      ManagementClass processClass = new ManagementClass("Win32_Process");

      // Option 1: Invocation using parameter objects
      //================================================

      //Get an input parameters object for this method
      ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

      //Fill in input parameter values
      inParams["CommandLine"] = "calc.exe";

      //Execute the method
      ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null);

      //Display results
      //Note: The return code of the method is provided in the "returnValue" property of the outParams object
      Console.WriteLine("Creation of calculator process returned: " + outParams["returnValue"]);
      Console.WriteLine("Process ID: " + outParams["processId"]);

      // Option 2: Invocation using args array
      //=======================================

      //Create an array containing all arguments for the method
      object[] methodArgs = {"notepad.exe", null, null, 0};

      //Execute the method
      object result = processClass.InvokeMethod ("Create", methodArgs);

      //Display results
      Console.WriteLine ("Creation of process returned: " + result);
      Console.WriteLine ("Process id: " + methodArgs[3]);
    }

}

Il est également possible d'exécuter les méthodes de manière asynchrone. L'exemple suivant montre comment procéder :

using System;
using System.Management;

public class InvokeMethodAsync {

    public static void Main() {

      //Get the object on which the method will be invoked
      ManagementClass processClass = new ManagementClass("Win32_Process");

      // Create a results and completion handler
      ManagementOperationObserver handler = new ManagementOperationObserver();
      ObjectReadyHandler objHandler = new ObjectReadyHandler();
        handler.ObjectReady += new ObjectReadyEventHandler(objHandler.NewObject);

      // Invoke method asynchronously
      ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
      inParams["CommandLine"] = "calc.exe";
      processClass.InvokeMethod(handler, "Create", inParams, null);
      
      //Do something while method is executing
      while(!objHandler.IsComplete) {
         System.Threading.Thread.Sleep(1000);
      }

      //After execution is completed, display results
      Console.WriteLine("Creation of calculator process returned: " + objHandler.ReturnObject["returnValue"]);
      Console.WriteLine("Process ID: " + objHandler.ReturnObject["processId"]);

    }

   public class ObjectReadyHandler   {

      private bool isComplete = false;
        private ManagementBaseObject returnObject;

      //Delegate called when the method completes and results are available
      public void NewObject(object sender, ObjectReadyEventArgs e) {
         Console.WriteLine("New Object arrived!");
         ReturnObject = e.NewObject;
         isComplete = true;
      }

      //Property allows accessing the result object in the main function
      public ManagementBaseObject ReturnObject {
         get {
            return returnObject;
         }
      }

      //Used to determine whether the method execution has completed
      public bool IsComplete {
         get {
            return isComplete;
         }
      }
   }
}

Voir aussi

Accès aux informations de gestion avec System.Management | Extraction de collections d'objets de gestion | Soumission de requêtes pour obtenir des informations de gestion | Abonnement à des événements de gestion et consommation de ces événements | Options d'accès distant et de connexion | Utilisation d'objets fortement typés