プロセスからCOM EXEをインスタンス化するクラスがあります。クラスはプロセスが終了したときにC#のクリーンアップアンマネージドリソース
public class MyComObject:IDisposable
{
private bool disposed = false;
MyMath test;
public MyComObject()
{
test = new MyMath();
}
~MyComObject()
{
Dispose(false);
}
public double GetRandomID()
{
if (test != null)
return test.RandomID();
else
return -1;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (test != null)
{
Marshal.ReleaseComObject(test);
test = null;
}
disposed = true;
}
}
あると
今static void Main(string[] args)
{
MyComObject test = new MyComObject();
MyComObject test2 = new MyComObject();
//Do stuff
test.Dispose();
test2.Dispose();
Console.ReadLine();
}
を次のように私はそれを呼び出すプログラムが正常に実行されたとき、これは私のCOMオブジェクトをクリーンアップします。しかし、実行の途中でプログラムを閉じると、フレームワークはアンマネージドオブジェクトを解放するコードを呼び出すことはありません。どちらが十分です。しかし、殺されたにもかかわらずプログラム自体をきれいにする方法がありますか?
EDIT:それはタスクマネージャからハードキルから有望に見えない:(
でも動作しません。使用中のブロックの途中でプロセスを終了すると、COMサーバーは生き残ります。 – Steve
あなたはどのようにプロセスを殺していますか?あなたは何が起こっているのかを見るためにあなたの処分ブロックにログを記録しましたか? –
(通常のシャットダウンでプログラムを閉じても問題ありません。タスクマネージャから終了するのは難しいでしょう)プログラムを「通常の」方法で閉じると、COMサーバーが正しくシャットダウンされますか? –