ExecutionEngineException при вызове метода от несвязанного поставщика WMI - PullRequest
1 голос
/ 02 сентября 2010

Я столкнулся с проблемой, когда при вызове метода у разобщенного поставщика WMI (разработанного с использованием расширений провайдера WMI в .NET 3.5) возникает исключение ExecutionEngineException при запуске более одного экземпляра моего приложения. Кто-нибудь сталкивался с этим ограничением раньше или я что-то не так делаю?

Я создал (простого) провайдера WMI и опубликовал его ctor формы (WinForms). Если вы запускаете один экземпляр приложения, все работает отлично; однако, если вы запустите несколько экземпляров приложения, один из них завершится сбоем при вызове метода WMI.

Вот класс поставщика WMI (класс установщика и форма, которая публикует объект WMI). Он примерно основан на этой статье .

[assembly: WmiConfiguration(@"root\foo", HostingModel = ManagementHostingModel.Decoupled)]    

[ManagementEntity(Singleton = false)]
[ManagementQualifier("Description", Value = "Obtain processor information.")]
public class Test
{
    private readonly int _id;
    private int _value;

    [ManagementBind]
    public Test([ManagementName("Id")] int id)
    {
        _id = id;
    }

    [ManagementKey]
    public int Id
    {
        get { return _id; }
    }

    [ManagementProbe]
    [ManagementQualifier("Description", Value = "The number of processors.")]
    public int Value
    {
        get { return _value; }
    }

    [ManagementTask]
    public void Increment()
    {
        _value++;
    }

    public static Test Create()
    {
        int id = Process.GetCurrentProcess().Id;
        var wmi = new Test(id);
        return wmi;
    }
}

/// <summary>
/// This installer is for the WMI Provider Extensions for .NET 3.5 support.
/// </summary>
public class LearningWmiManagementInstaller : DefaultManagementInstaller 
{}

public partial class Form1 : Form
{
    private Test _pi;

    public Form1()
    {
        InitializeComponent();

        _pi = Test.Create();
        InstrumentationManager.Publish(_pi);
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        InstrumentationManager.Revoke(_pi);
    }
}

Конечно, я использую installutil для запуска класса установщика WMI. Далее запускаем два экземпляра приложения. Если вы вызываете метод «Инкремент» WMI [ManagementTask] с помощью инструмента wmic в одном из процессов, то происходит сбой другого (как ни странно, не того, который вы вызываете).

wmic /namespace:\\root\foo path Test.Id=<process-id> call increment

Любые предложения будут с благодарностью.

...