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

Tengo un objeto COM escrito en código administrado (C ++ / CLI). Estoy usando ese objeto en C ++ estándar.
¿Cómo hago para que se llame al destructor de mi objeto COM inmediatamente cuando se libera el objeto COM? Si eso no es posible, ¿tengo llamada Release () llamar a un método MyDispose () en mi objeto COM?

Mi código para declarar el objeto (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();
    };

Mi código para usar el objeto (C ++ nativo):

#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().

Si pongo un método destructor en mi objeto COM, nunca se llama. Si pongo un método de finalizador, se llama cuando el recolector de basura se acerca a él. Si llamo explícitamente a mi liberación de Release (), nunca se llamará.

Realmente me gustaría que cuando mi objeto nativo Bar :: IFoo quede fuera del alcance, automáticamente llame al código de disposición de mi objeto .NET. Pensaría que podría hacerlo anulando la Liberación (), y si el recuento de objetos = 0, llame a MyDispose (). Pero aparentemente no estoy anulando correctamente a Release () porque nunca se llama a mi método Release ().

Obviamente, puedo hacer que esto suceda poniendo mi método MyDispose () en la interfaz y requiriendo que las personas que usan mi objeto llamen a MyDispose () antes de Release (), pero sería más fácil si Release () simplemente limpiara el objeto.

¿Es posible forzar que el destructor del objeto COM de .NET, o algún otro método, sea llamado inmediatamente cuando se libera un objeto COM?

Al buscar en Google este problema, recibo muchos hits que me dicen que llame a System.Runtime.InteropServices.Marshal.ReleaseComObject (), pero claro, así es como le dices a .NET que libere un objeto COM. Quiero COM Release () para desechar un objeto .NET.

Respuestas a la pregunta(6)

Su respuesta a la pregunta