COM-object dat is gescheiden van zijn onderliggende RCW kan niet worden gebruikt

Ik heb een COM-component die ik aanroep vanuit een c# dll.

Ik heb ook een winforms-app die die .dll gebruikt.

Als ik de app sluit, krijg ik deze uitzondering:

COM-object dat is gescheiden
van de onderliggende RCW kan niet worden
gebruikt.

De stacktracering laat zien dat deze uitzondering afkomstig is van een destructor in de .dll. Ik heb deze destructor geïmplementeerd om een ​​opruimmethode in de COM aan te roepen.

Waarom gebeurt dit? Hoe kan ik dit het beste oplossen?


Antwoord 1, autoriteit 100%

Het probleem wordt hier beschreven:

Is het veilig om een ​​RCW te bellen vanaf een finaliseren?

en hier:

Excel-object vrijgeven in Mijn Destructor

Het probleem is dat niet alleen de timing is wanneer deze objecten
zijn om afval te verzamelen onzeker, maar de volgorde waarin de
finalizers worden genoemd, is ook niet-deterministisch. In dit geval is een
Runtime Callable Wrapper heeft ook een finalizer, die roept
Marshal.FinalReleaseComObject op zichzelf, wat het resultaat heeft van
het verlagen van de referentietelling aan de COM-zijde van het hek zodat:
dit COM-object kan worden vrijgegeven. Maar aangezien de volgorde waarin de
finalisten worden genoemd is onzeker, het is heel goed mogelijk dat de
finalizers voor de COM-objecten die uw objectreferenties zullen vuren
vóór de finalizer voor uw object. Dus de code in je
finalizer kan soms werken, maar meestal een of meer van
de Runtime Callable Wrappers die uw objectreferenties zullen hebben
hadden hun finalizers al aangeroepen en het onderliggende COM-object zal
zijn vrijgegeven voordat uw finalizer zijn code kan uitvoeren.

Other episodes