2008-09-15 4 views
1

wmi를 통해 게시 된 인 클래스로 별도의 어셈블리를 만들었습니다. 그런 다음 이 어셈블리를 참조하고 클래스를 게시하려고 시도하는 Windows 양식 앱을 만들었습니다. 클래스를 게시하려고하면 System.Management.Instrumentation.WmiProviderInstallationException 예외가 발생합니다. 예외 메시지에 " 유형의 예외 'System.Management.Instrumentation.WMIInfraException'이 (가) throw되었습니다." 나는 이 무엇을 의미하는지 모른다. 나는 .Net2.0과 .Net3.5 (sp1 너무)를 시도하고 같은 결과를 얻는다..net에 wmi 클래스를 게시하는 방법은 무엇입니까?

다음은 내 wmi 클래스이고 그 뒤에 게시하는 코드가 나와 있습니다. (DLL로) 클래스를 테스트하기 위해 installutil -

//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


//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; } 
     } 
    } 
} 
내가 gacutil을 사용했다. gacutil 부분은 작동했지만 (실제로 MOFCOMP)는 구문 오류에 대해 불평 installutil :

...

오류 구문 0X80044014 : 클래스 이름에 예기치 않은 문자 (식별자이어야 함)

컴파일러가 반환 오류 0x80044014

은 ...

그래서 나는 부분은 근무 installutil '하는 MyInterface'에 클래스 이름을 변경하지만, 클래스는 인스턴스를 반환하지 않았습니다. 마지막으로 호스팅 모델을 Network Service로 변경하고 작동하도록했습니다.

Provider 클래스를, 그것의 자신의 어셈블리 : 요약하면

3

는,이 작품의 최종 코드

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

// 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 
    { 
    } 
} 

윈도우, 응용 프로그램 기본 폼을 형성 제공자 클래스를 게시

테스트 용 웹 애플리케이션, 소비자 :

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(); 
     } 
    } 
} 
관련 문제