VB6 вызов C # не выпускает - PullRequest
1 голос
/ 06 марта 2012

У меня есть код VB6, который вызывает C # с использованием позднего связывания, когда C # завершает, VB6 не освобождает ссылку C #, я пытался реализовать в C # IDisposable, я пытался установить ссылку на ничто, и это неработа

Возможно ли, что код VB6 не освобождает ссылку?Есть ли другой способ освободить все ссылки на код 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");
        }
    }
}

1 Ответ

6 голосов
/ 06 марта 2012

Это просто не способ управления памятью в управляемом коде. Правила не меняются только потому, что вы представляете его как класс [ComVisible]. Ваш код vb6 освободит CCW (вызываемая оболочка COM). Но это просто удаляет ссылку на объект C #. Объект не уничтожается, и финализатор не будет работать, пока не будет запущен сборщик мусора. Что в опубликованном фрагменте не произойдет, пока программа не завершится, вы не выделяете достаточно управляемых объектов для запуска GC.

Это не проблема.

...