アプリケーションの複数のインスタンスを実行しているときに、分離された WMI プロバイダー (.NET 3.5 の WMI プロバイダー拡張機能を使用して開発) でメソッドを呼び出すと、ExecutionEngineException がスローされるという問題に遭遇しました。以前に誰かがこの制限に遭遇したことがありますか、それとも私は何か間違ったことをしていますか?
(単純な) WMI プロバイダーを作成し、(WinForms) フォームの ctor として公開しました。アプリケーションの 1 つのインスタンスを実行すると、すべてがうまく機能します。ただし、アプリケーションの複数のインスタンスを実行すると、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 インストーラー クラスを実行します。次に、アプリケーションの 2 つのインスタンスを起動します。一方のプロセスで wmic ツールを使用して「Increment」WMI [ManagementTask] メソッドを呼び出すと、もう一方のプロセスがクラッシュします (奇妙なことに、呼び出したプロセスではありません)。
wmic /namespace:\\root\foo path Test.Id=<process-id> call increment
どんな提案でも大歓迎です。