2012-03-05 4 views
2

私は、VB6は、VB6は、C#の参照を解放しないで、私はC#のIDisposableで実装しようとしたときに、バインディングを使用してC#を呼び出すVB6のコードを持っています 私は参照を設定しようとしました。何も動作しませんでした。VB6コールC#はリリースしません

VB6コードがrefを解放しない可能性はありますか? C#コードへの参照をすべて解放する他の方法はありますか? 私は使用できる注釈はありますか?

VB6はサードパーティ製のコードであり、機能/コードの呼び出し を追加することはできません。

おかげ X

VB6

Private Sub Command1_Click() 
    Dim obj As Object 
    Set obj = CreateObject("test1.class1") 
    obj.msg 
    Set obj = Nothing 
End Sub 

C#

namespace test1 
{ 
    [ClassInterface(ClassInterfaceType.None)] 
    public class Class1 : IDisposable 
    { 
     public void msg() 
     { 
      Console.Write("msg"); 
     } 
     ~Class1() 
     { 
      Console.Write("~Class1"); 
     } 

     public void Dispose() 
     { 
      Console.Write("Dispose"); 
     } 
    } 
} 
+2

なぜC#オブジェクトが解放されないと思いますか? .NETガベージコレクタが確定的でないことを忘れないでください。 – phoog

+1

参照を 'Nothing'に設定するのではなく、VB6コードで' Dispose() 'を明示的に呼び出そうとしましたか? –

+0

VB6コードはサードパーティ製のアプリですので、Dispose()、 への呼び出しを追加できません。C#をビルドしようとしたときにDLLが別のプロセス(VB6)によってロックされていたため、C#を解放しません。 – Xoerk

答えて

6

これは、単純にメモリ管理は、マネージコードで動作する方法はありません。ルールは、[ComVisible]クラスとして公開するだけで変更されるわけではありません。あなたのvb6コードは、CCW(COM呼び出し可能ラッパー)をリリースします。しかし、それはC#オブジェクトへの参照を削除するだけです。オブジェクトは破棄されず、ファイナライザはガベージコレクタが実行されるまで実行されません。あなたの投稿されたスニペットでは、プログラムが終了するまでに起こらないスニペットでは、GCを起動するのに十分な管理オブジェクトを割り当てていません。

これは問題ではありません。

関連する問題