2008-09-15 4 views
1

私は、wmiを通じて公開された のクラスを持つ別個のアセンブリを作成しました。次に、 がアセンブリを参照し、クラスを公開しようとするWindowsフォームアプリケーションを作成しました。 クラスを公開しようとすると、タイプ System.Management.Instrumentation.WmiProviderInstallationExceptionの例外が発生します。例外のメッセージ は、 " タイプの例外 'System.Management.Instrumentation.WMIInfraException'がスローされました。"私には の意味がありません。私は試してみました.Net2.0と.Net3.5(sp1も)と同じ結果を得る。wmiクラスを.netで公開するには?

以下は私のwmiクラスです。その後、私が公開したコードが続きます。

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

答えて

0

私がます。gacutilを使用 - にます。installutil(DLLとして)あなたのクラスをテストします。ます。gacutil部分は働いたが、(実際にMOFCOMP)は、構文エラー不満ます。installutil:

...

エラーSYNTAX 0X80044014:クラス名に 予期しない文字(識別子でなければなりません)

コンパイラが返さエラー0x80044014

...

は、だから私は、ます。installutil部分が働いていた「MyInterface」にクラス名を変更しましたが、このクラスは、すべてのインスタンスを返しませんでした。最後に、ホスティングモデルをNetwork Serviceに変更して動作させました。要約する

3

、これが機能する最終的なコードです:

Providerクラスを、それ自身のアセンブリに:

// 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は、アプリケーションのメインフォームを形成し、プロバイダクラスを公開する:

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

テストWebアプリケーション、コンシューマ:

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(); 
     } 
    } 
} 
関連する問題