2012-03-05 64 views
2

我有一個VB6代碼,通過使用後期綁定調用C#,當C#完成VB6不釋放C#引用,我試圖在C#IDisposable執行 我試着設置參考沒有和它沒有工作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 2012-03-05 23:05:01

+1

您是否曾嘗試在VB6代碼中顯式調用'Dispose()'而不是將參考設置爲'Nothing'? – 2012-03-05 23:05:28

+0

VB6代碼是第三方應用程序,我不能添加調用Dispose(), ,我知道它不釋放C#,因爲當我嘗試再次構建C#時,DLL被另一個進程(VB6)鎖定... – Xoerk 2012-03-05 23:34:12

回答

6

這根本就不是在託管代碼中的內存管理的工作方式。規則不會因爲您將其公開爲[ComVisible]類而改變。您的vb6代碼將釋放CCW(COM可調用包裝器)。但是,這只是刪除了對C#對象的引用。該對象不會被銷燬,並且終結器不會運行,直到垃圾收集器運行。在發佈的代碼片段中,只有當程序終止時纔會發生,您沒有分配足夠的託管對象來觸發GC。

這不是問題。