Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# Klasa comowa nie zostaje zniszczona gdy docelowy program już jej nie potrzebu

mikmas 20 Lis 2017 17:38 258 2
  • #1 20 Lis 2017 17:38
    mikmas
    Poziom 18  

    Nie wiedziałem za bardzo jak zajawkowo opisać problem, stąd taki dziki tytuł :)

    Mam napisaną w C# klasę comową (ComVisible) i wykorzystuję ją w VB6. Po zniszczeniu wszystkich referencji do niej w VB6 powinna ona zostać zniszczona. Tak się nie dzieje. Musze zadeklarować jakiś atrybut, który zezwoli samowolne wyładowanie jej?

    Przedtem korzystałem z klasy activex z vb6 w vb6 i oprócz tego, że klasa była niszczona to dodatkowo plik dll był zwalniany (cały moduł był wyładowywany). Po przejściu na C# plik jest cały czas używany przez proces, co trochę utrudnia developerkę.

    0 2
  • #2 21 Lis 2017 09:22
    JacekCz
    Poziom 36  

    Głośno myślę ... w systemach z GC destrukcja (skrótowo - wszystkie jej fazy) nie jest oczywista co do czasu. Utrata aktywności obiektu (mówiąc popularnie zaprzestanie dostarczania użytecznej pracy) nie oznacza jego zniszczenia.

    Obserwuję podobne zjawisko: usługa windows zaimplementowana w C# / .NET. W sposób nieregularny, po wyłączeniu usługi, np w celu wgrania nowej wersji, niektóre DLL/assembles jeszcze są trzymane.
    Nie traktuję tego nerwowo, po 10sek-minucie są zwalniane.

    0
  • #3 21 Lis 2017 19:25
    mikmas
    Poziom 18  

    Też stawiałbym na GC, ale niestety uchwyty nie są zwalniane nawet op dłuższym czasie. Kiedyś wpadło w moje ręce takie narzędzie w VS, które pokazywało listę niezwolnionych obiektów, jednak nie mogę teraz tego znaleźć. Może tam bym odkrył, że faktycznie jakieś "coś" chroni klasę przed zjedzeniem przez GC?

    0