2008-09-15 14 views
1

J'ai créé un assembly séparé avec une classe destinée à être publiée via wmi. Ensuite, j'ai créé une application Windows Forms qui fait référence à cet assembly et tente de publier la classe. Lorsque j'essaie de publier la classe , j'obtiens une exception de type System.Management.Instrumentation.WmiProviderInstallationException. Le message de l'exception indique "Exception du type 'System.Management.Instrumentation.WMIInfraException' a été levée.". J'ai aucune idée de ce que cela signifie. J'ai essayé .Net2.0 et .Net3.5 (sp1 aussi) et obtiens les mêmes résultats. Ci-dessous ma classe wmi, suivie du code que j'ai utilisé pour la publier.Comment publier des classes wmi dans .net?

//Interface.cs in assembly WMI.Interface.dll 

using System; 
using System.Collections.Generic; 
using System.Text; 

[assembly: System.Management.Instrumentation.WmiConfiguration(@"root\Test", 
    HostingModel = 
System.Management.Instrumentation.ManagementHostingModel.Decoupled)] 

namespace WMI 
{ 
    [System.ComponentModel.RunInstaller(true)] 
    public class MyApplicationManagementInstaller : 
     System.Management.Instrumentation.DefaultManagementInstaller { } 

    [System.Management.Instrumentation.ManagementEntity(Singleton = true)] 
    [System.Management.Instrumentation.ManagementQualifier("Description", 
     Value = "Obtain processor information.")] 
    public class Interface 
    { 
     [System.Management.Instrumentation.ManagementBind] 
     public Interface() 
     { 
     } 

     [System.Management.Instrumentation.ManagementProbe] 
     [System.Management.Instrumentation.ManagementQualifier("Descriiption", 
      Value="The number of processors.")] 
     public int ProcessorCount 
     { 
      get { return Environment.ProcessorCount; } 
     } 
    } 
} 


//Button click in windows forms application to publish class 
try 
{ 
    System.Management.Instrumentation.InstrumentationManager.Publish(new 
WMI.Interface()); 
} 
catch (System.Management.Instrumentation.InstrumentationException 
exInstrumentation) 
{ 
    MessageBox.Show(exInstrumentation.ToString()); 
} 
catch (System.Management.Instrumentation.WmiProviderInstallationException 
exProvider) 
{ 
    MessageBox.Show(exProvider.ToString()); 
} 
catch (Exception exPublish) 
{ 
    MessageBox.Show(exPublish.ToString()); 
} 

Répondre

0

J'utilisé gacutil - installutil pour tester votre classe (comme dll). La partie gacutil a travaillé, mais installutil (en fait Mofcomp) plaint d'une erreur de syntaxe:

...

Syntax error 0X80044014: Caractère inattendu dans le nom de la classe (doit être un identifiant)

compilateur retourné erreur 0x80044014

...

Je changé le nom de la classe à «MyInterface la partie installutil a travaillé, mais la classe n'a retourné aucun cas. Enfin, j'ai changé le modèle d'hébergement en Network Service et je l'ai mis au travail.

3

En résumé, c'est le code final qui fonctionne:

classe Provider, dans son propre montage:

// the namespace used for publishing the WMI classes and object instances 
[assembly: Instrumented("root/mytest")] 

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Management; 
using System.Management.Instrumentation; 
using System.Configuration.Install; 
using System.ComponentModel; 

namespace WMITest 
{ 

    [InstrumentationClass(System.Management.Instrumentation.InstrumentationType.Instance)] 
    //[ManagementEntity()] 
    //[ManagementQualifier("Description",Value = "Obtain processor information.")] 
    public class MyWMIInterface 
    { 
     //[System.Management.Instrumentation.ManagementBind] 
     public MyWMIInterface() 
     { 
     } 

     //[ManagementProbe] 
     //[ManagementQualifier("Descriiption", Value="The number of processors.")] 
     public int ProcessorCount 
     { 
      get { return Environment.ProcessorCount; } 
     } 
    } 

    /// <summary> 
    /// This class provides static methods to publish messages to WMI 
    /// </summary> 
    public static class InstrumentationProvider 
    { 
     /// <summary> 
     /// publishes a message to the WMI repository 
     /// </summary> 
     /// <param name="MessageText">the message text</param> 
     /// <param name="Type">the message type</param> 
     public static MyWMIInterface Publish() 
     { 
      // create a new message 
      MyWMIInterface pInterface = new MyWMIInterface(); 

      Instrumentation.Publish(pInterface); 

      return pInterface; 
     } 

     /// <summary> 
     /// revoke a previously published message from the WMI repository 
     /// </summary> 
     /// <param name="Message">the message to revoke</param> 
     public static void Revoke(MyWMIInterface pInterface) 
     { 
      Instrumentation.Revoke(pInterface); 
     }   
    } 

    /// <summary> 
    /// Installer class which will publish the InfoMessage to the WMI schema 
    /// (the assembly attribute Instrumented defines the namespace this 
    /// class gets published too 
    /// </summary> 
    [RunInstaller(true)] 
    public class WMITestManagementInstaller : 
     DefaultManagementProjectInstaller 
    { 
    } 
} 

application Windows Forms forme principale, publie classe fournisseur:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Management; 
using System.Management.Instrumentation; 

namespace WMI 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     WMITest.MyWMIInterface pIntf_m; 

     private void btnPublish_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       pIntf_m = WMITest.InstrumentationProvider.Publish(); 
      } 
      catch (ManagementException exManagement) 
      { 
       MessageBox.Show(exManagement.ToString()); 
      } 
      catch (Exception exPublish) 
      { 
       MessageBox.Show(exPublish.ToString()); 
      } 
     } 
    } 
} 

Application Web de test, consommateur:

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Management.Instrumentation; 
using System.Management; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      ManagementClass pWMIClass = null; 

      pWMIClass = new ManagementClass(@"root\interiorhealth:MyWMIInterface"); 

      lblOutput.Text = "ClassName: " + pWMIClass.ClassPath.ClassName + "<BR/>" + 
       "IsClass: " + pWMIClass.ClassPath.IsClass + "<BR/>" + 
       "IsInstance: " + pWMIClass.ClassPath.IsInstance + "<BR/>" + 
       "IsSingleton: " + pWMIClass.ClassPath.IsSingleton + "<BR/>" + 
       "Namespace Path: " + pWMIClass.ClassPath.NamespacePath + "<BR/>" + 
       "Path: " + pWMIClass.ClassPath.Path + "<BR/>" + 
       "Relative Path: " + pWMIClass.ClassPath.RelativePath + "<BR/>" + 
       "Server: " + pWMIClass.ClassPath.Server + "<BR/>"; 

      //GridView control 
      this.gvProperties.DataSource = pWMIClass.Properties; 
      this.gvProperties.DataBind(); 

      //GridView control 
      this.gvSystemProperties.DataSource = pWMIClass.SystemProperties; 
      this.gvSystemProperties.DataBind(); 

      //GridView control 
      this.gvDerivation.DataSource = pWMIClass.Derivation; 
      this.gvDerivation.DataBind(); 

      //GridView control 
      this.gvMethods.DataSource = pWMIClass.Methods; 
      this.gvMethods.DataBind(); 

      //GridView control 
      this.gvQualifiers.DataSource = pWMIClass.Qualifiers; 
      this.gvQualifiers.DataBind(); 
     } 
    } 
}