如何在.net中发布WMI类?
时间:2020-03-05 18:54:10 来源:igfitidea点击:
我创建了一个单独的程序集,该程序集旨在
通过wmi发布。然后,我创建了一个Windows窗体应用程序
引用该程序集并尝试发布该类。当我尝试
发布类,我得到类型的异常
System.Management.Instrumentation.WmiProviderInstallationException。这
异常消息显示"类型异常
我抛出了" System.Management.Instrumentation.WMIInfraException"。
不知道这意味着什么。我已经试过了.Net2.0和.Net3.5(也有sp1),并得到了相同的结果。
下面是我的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()); }
解决方案
回答
我使用gacutil installutil来测试类(作为dll)。 gacutil部分有效,但installutil(实际上是mofcomp)抱怨语法错误:
...
错误SYNTAX 0X80044014:
类名中的意外字符(必须是标识符)
编译器返回错误0x80044014
...
因此,我将类名称更改为" MyInterface",installutil部分起作用了,但是该类未返回任何实例。最后,我将托管模型更改为"网络服务",并使其开始工作。
回答
总而言之,这是有效的最终代码:
提供程序类,在其自己的程序集中:
// 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(); } } }