Я столкнулся с проблемой, когда при вызове метода у разобщенного поставщика 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
Любые предложения будут с благодарностью.