C# 在解耦的WMI提供程序上调用方法时ExecutionEngineeException
我遇到了一个问题,在运行应用程序的多个实例时,在解耦的WMI提供程序(使用.NET 3.5中的WMI提供程序扩展开发)上调用方法会引发ExecutionEngineeException。以前有没有人遇到过这种限制,或者我做错了什么 我创建了一个(简单的)WMI提供程序,并将其发布到(WinForms)表单的ctor。如果您运行应用程序的一个实例,那么一切都很好;但是,如果您运行应用程序的多个实例,则其中一个实例在调用WMI方法时将崩溃 下面是它大致基于的WMI提供程序类(安装程序类和发布WMI对象的表单)C# 在解耦的WMI提供程序上调用方法时ExecutionEngineeException,c#,.net-3.5,wmi,executionengineexception,C#,.net 3.5,Wmi,Executionengineexception,我遇到了一个问题,在运行应用程序的多个实例时,在解耦的WMI提供程序(使用.NET 3.5中的WMI提供程序扩展开发)上调用方法会引发ExecutionEngineeException。以前有没有人遇到过这种限制,或者我做错了什么 我创建了一个(简单的)WMI提供程序,并将其发布到(WinForms)表单的ctor。如果您运行应用程序的一个实例,那么一切都很好;但是,如果您运行应用程序的多个实例,则其中一个实例在调用WMI方法时将崩溃 下面是它大致基于的WMI提供程序类(安装程序类和发布WMI对
[程序集:WmiConfiguration(@“root\foo”,HostingModel=ManagementHostingModel.Decoupled)]
[管理实体(单例=假)]
[ManagementQualifier(“Description”,Value=“获取处理器信息”)]
公开课考试
{
私有只读int_id;
私有整数值;
[管理绑定]
公共测试([ManagementName(“Id”)]int-Id)
{
_id=id;
}
[管理钥匙]
公共整数Id
{
获取{return\u id;}
}
[管理探索]
[ManagementQualifier(“Description”,Value=“处理器数量”)]
公共整数值
{
获取{返回_值;}
}
[管理任务]
公共空间增量()
{
_值++;
}
公共静态测试创建()
{
int id=Process.GetCurrentProcess().id;
var wmi=新测试(id);
返回wmi;
}
}
///
///此安装程序用于.NET 3.5支持的WMI提供程序扩展。
///
公共类LearningWmiManagementInstaller:DefaultManagementInstaller
{}
公共部分类Form1:Form
{
私人测试(pi),;
公共表格1()
{
初始化组件();
_pi=Test.Create();
InstrumentationManager.Publish(_-pi);
}
关闭时受保护的覆盖无效(事件参数e)
{
基础。一旦关闭(e);
InstrumentationManager.Revoke(_-pi);
}
}
当然,我使用installutil来运行WMI安装程序类。接下来,启动应用程序的两个实例。如果在其中一个进程上使用wmic工具调用“增量”WMI[ManagementTask]方法,则另一个进程将崩溃(奇怪的是,不是您调用的那个)
wmic/namespace:\\root\foo路径测试.Id=调用增量
如有任何建议,将不胜感激
[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);
}
}
wmic /namespace:\\root\foo path Test.Id=<process-id> call increment