在解耦的WMI提供程序上调用方法时的ExecutionEngineException

时间:2010-09-01 22:20:34

标签: c# .net-3.5 wmi executionengineexception

我遇到一个问题,在解析的WMI提供程序上调用方法(使用.NET 3.5中的WMI Provider Extensions开发)在运行我的应用程序的多个实例时会抛出ExecutionEngineException。有没有人遇到过这种限制或者我做错了什么?

我创建了一个(简单的)WMI提供程序并将其发布为(WinForms)表单的ctor。如果你运行一个应用程序实例,一切都很好;但是,如果您运行应用程序的多个实例,则在调用WMI方法时会崩溃。

这是WMI提供程序类(安装程序类和发布WMI对象的表单)它大致基于this article

[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安装程序类。接下来,启动应用程序的两个实例。如果你在其中一个进程上使用wmic工具调用“Increment”WMI [ManagementTask]方法,那么另一个将崩溃(奇怪的是,不是你调用的那个)。

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

任何建议都将不胜感激。

0 个答案:

没有答案