我遇到一个问题,在解析的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
任何建议都将不胜感激。