2012-03-05 12 views
2

C#でIDispatchインターフェイスを実装しました。また、アンマネージCOMインターフェイスが開き、IDispatchインターフェイスも公開されます。IDispatch COMインターフェイスをラップするc#インターフェイスの廃棄

~MyObject() 
    { 
     Logger.TraceDebug("About to clean up object"); 
     CleanupObject(); 
    } 


    private void CleanupObject() 
    { 
     lock (lock_so) 
     { 
      try 
      { 
       if (so != null) 
       { 
        Logger.TraceWarning("Releasing object"); 
        Marshal.FinalReleaseComObject(so); 
       } 

      } 
      catch (Exception e) 
      { 
      } 
      so = null; 
     } 

    } 

私がいる問題は、オブジェクトが失敗包まれたインタフェースにアクセスするには、後にしようとする通常の実行の意味中に使用されている間、ファイナライズが呼び出されていることです。クリーンアップコードを取り出すと、コードは正常に動作しますが、コードを使用しているプログラムが終了すると失敗します(呼び出し元のアプリケーションからデバッグ情報はありませんが、ラップされたインターフェイスは破棄されている可能性があります)。私はこの問題にどのように対処し、私の理解が間違っていると考えているかについては迷っています。どんな提案も大歓迎です。

目的は、以下に初期化される:このすべての点は、C#インターフェースはクラスを通過するときに作用するとログインできる

public void DoSomething(string String) 
    { 
     try 
     { 
      lock (lock_so) 
      { 
      Object[] args = new Object[1]; 
      args[0] = String; 
      so.GetType().InvokeMember("DoSomething", BindingFlags.InvokeMethod, null, so, args); 
      } 
     } 

private void InitialiseObject() 
    { 
     if (so == null) 
     { 
      so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID)); 
     } 
    } 

は次にように使用しました情報は第三者アプリケーションからIDispatchインターフェイスに渡されます。

+0

このオブジェクトの使用方法を投稿できますか?また、フルクラスはいいね – cadrell0

+0

私は少し混乱しています。オブジェクトを廃棄した後、ラップされたインタフェースにアクセスしようとしているのはなぜですか?または、おそらくこの質問は、「終了する前にFinalizeを呼び出しているオブジェクトがなぜ呼び出されているのですか」と言い換えることができます。 – Chris

+0

@Chris私はそれをやろうとしていません - 私のクラスは、サードパーティのアプリケーションと情報をログに記録する基礎となるインターフェースの間にあります。それは単にメソッドと呼ばれています。 –

答えて

0

なぜこれが必要ですか?私はあなたと私はいくつかのリソースを解放するメソッドをdisposeしたい場合は、IDisposableインターフェイスを実装します。 Pattern

+0

良い点、私はそれを改善するはずですので、うまくいけば、質問を変更しました。要約すると、情報を記録するパススルーインターフェースです。 –

関連する問題