Как опубликовать классы wmi в .net?

Я создал отдельную сборку с классом, который предназначен для опубликовано через wmi. Затем я создал приложение Windows Forms, которое ссылается на эту сборку и пытается опубликовать класс. Когда я пытаюсь публикуйте класс, я получаю исключение типа 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());
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
5 423
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я использовал gacutil - installutil, чтобы протестировать ваш класс (как dll). Часть gacutil работала, но installutil (на самом деле mofcomp) пожаловался на синтаксическую ошибку:

...

ошибка SYNTAX 0X80044014: Неожиданный символ в имени класса (должен быть идентификатором)

Компилятор вернул ошибку 0x80044014

...

Поэтому я изменил имя класса на «MyInterface», часть installutil работала, но класс не вернул никаких экземпляров. Наконец, я изменил модель хостинга на Network Service и заставил ее работать.

Подводя итог, это последний работающий код:

Класс провайдера в собственной сборке:

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

Тестовое веб-приложение, потребитель:

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

Другие вопросы по теме