2009-03-24 13 views
8

プロセスから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:それはタスクマネージャからハードキルから有望に見えない:(

答えて

8

最後に試してみたり、 :

using (MyComObject test = new MyComObject()) 
using (MyComObject test2 = new MyComObject()) { 
    // do stuff 
} 
Console.ReadLine(); 

how your app is being shutdownの詳細は、しかし、(CriticalFinalizerObjectを使用してのように)あなたが行うことができ、他の措置を決定します。

l と思うと、(小さなxから)閉じられるコンソールアプリケーションはCtrl-Cと同じです - その場合はsubscribe to Console.CancelKeyPressが可能です。

編集:あなたもReleaseComObject until it returns <= 0にする必要があります。

5

まあ、1つのベストプラクティスはusingステートメントを使用することです:

using (MyComObject test = new MyComObject()) 
using (MyComObject test2 = new MyComObject()) 
{ 
    //Do stuff 
} 

本質的にでfinallyブロックを置きますスコープの終わりに自動的に処理するようにしてください。あなたがIDisposableのインスタンスを持っているときにはいつも、usingステートメントを持っていなければなりませんが、プロセス全体が突然終了する状況は修正されません。かなり稀ですが、yそれについて心配したくないかもしれません。 (それを得るのはかなり難しいです)が期待されていますあなたのファイナライザはあなたの前のコードで呼び出されます..

+0

でも動作しません。使用中のブロックの途中でプロセスを終了すると、COMサーバーは生き残ります。 – Steve

+0

あなたはどのようにプロセスを殺していますか?あなたは何が起こっているのかを見るためにあなたの処分ブロックにログを記録しましたか? –

+0

(通常のシャットダウンでプログラムを閉じても問題ありません。タスクマネージャから終了するのは難しいでしょう)プログラムを「通常の」方法で閉じると、COMサーバーが正しくシャットダウンされますか? –

関連する問題