How to dispose of a NET COM interop object on Release()

Mam obiekt COM napisany w kodzie zarządzanym (C ++ / CLI). Używam tego obiektu w standardowym C ++.
Jak wymusić wywołanie destruktora mojego obiektu COM natychmiast po zwolnieniu obiektu COM? Jeśli to nie jest możliwe, wywołanie I wywołuje metodę Release () wywołującą metodę MyDispose () na moim obiekcie COM?

Mój kod do zadeklarowania obiektu (C ++ / CLI):

    [Guid("57ED5388-blahblah")]
    [InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface class IFoo
    {
        void Doit();
    };

    [Guid("417E5293-blahblah")]
    [ClassInterface(ClassInterfaceType::None)]
    [ComVisible(true)]
    public ref class Foo : IFoo
    {
    public:
        void MyDispose();
        ~Foo() {MyDispose();} // This is never called
        !Foo() {MyDispose();} // This is called by the garbage collector.
        virtual ULONG Release() {MyDispose();} // This is never called
        virtual void Doit();
    };

Mój kod do korzystania z obiektu (natywny C ++):

#import "..\\Debug\\Foo.tlb"
...
Bar::IFoo setup(__uuidof(Bar::Foo)); // This object comes from the .tlb.
setup.Doit();
setup->Release(); // explicit release, not really necessary since Bar::IFoo's destructor will call Release().

Jeśli umieściłem metodę destruktora na moim obiekcie COM, nigdy nie zostanie ona wywołana. Jeśli umieściłem metodę finalizatora, jest ona wywoływana, gdy garbage collector się do niej zbliża. Jeśli jawnie wywołam nadpisanie Release (), nigdy nie jest wywoływane.

Naprawdę podoba mi się to, że gdy mój rodzimy obiekt Bar :: IFoo wyjdzie poza zakres, automatycznie wywołuje mój kod utylizacji obiektu .NET. Myślę, że mógłbym to zrobić, zastępując Release (), i jeśli liczba obiektów = 0, wywołaj MyDispose (). Ale najwyraźniej nie nadpisuję poprawnie Release (), ponieważ moja metoda Release () nigdy nie jest wywoływana.

Oczywiście, mogę to zrobić, umieszczając moją metodę MyDispose () w interfejsie i wymagając od ludzi używających mojego obiektu, aby wywołali MyDispose () przed Release (), ale byłoby to bardziej niebezpieczne, gdyby Release () po prostu wyczyścił obiekt.

Czy można wymusić wywołanie destruktora obiektu COM .NET lub innej metody natychmiast po zwolnieniu obiektu COM?

Googling w tym wydaniu sprawia, że ​​mam wiele trafień mówiących mi, aby wywołać System.Runtime.InteropServices.Marshal.ReleaseComObject (), ale oczywiście to jest sposób, w jaki przekazuje się .NET do uwolnienia obiektu COM. Chcę, aby COM Release () usunął obiekt .NET.

questionAnswers(6)

yourAnswerToTheQuestion