2008-09-15 10 views
1

Ich habe eine separate Assembly mit einer Klasse erstellt, die durch WMI veröffentlicht werden soll. Dann habe ich eine Windows Forms App erstellt, die diese Assembly referenziert und versucht, die Klasse zu veröffentlichen. Wenn ich versuche, die Klasse zu veröffentlichen, erhalte ich eine Ausnahme vom Typ System.Management.Instrumentation.WmiProviderInstallationException. Die Botschaft der Ausnahme sagt: „Ausnahme vom Typ ‚System.Management.Instrumentation.WMIInfraException‘geworfen wurde.“. Ich habe keine Ahnung, was das bedeutet. Ich habe versucht. Net2.0 und. Net3.5 (SP1 zu) und bekomme die gleichen Ergebnisse.Wie veröffentlicht man WMI-Klassen in .net?

Unten ist meine WMI-Klasse, gefolgt von dem Code, den ich verwendet habe, um es zu veröffentlichen.

//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()); 
} 

Antwort

0

I verwendet gacutil - installutil Ihrer Klasse zu testen (als dll). Der gacutil Teil gearbeitet, aber installutil (eigentlich mofcomp) beschwerte sich über einen Syntaxfehler:

...

Fehler SYNTAX 0X80044014: Unerwartetes Zeichen in Klassennamen (muss ein Bezeichner sein)

Compiler zurück Fehler 0x80044014

...

Also änderte ich den Klassennamen zu ‚MyInterface‘ der installutil Teil gearbeitet, aber die Klasse alle Instanzen nicht zurück. Schließlich habe ich das Hosting-Modell auf Network Service umgestellt und es zum Laufen gebracht.

3

Um zusammenzufassen, ist dies der endgültige Code ist, das funktioniert:

Klasse Provider, in einem eigenen 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 
    { 
    } 
} 

Windows Forms-Hauptformular Anwendung veröffentlicht Provider-Klasse:

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()); 
      } 
     } 
    } 
} 

Test-Web-Anwendung, Verbraucher:

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(); 
     } 
    } 
} 
Verwandte Themen