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

У меня есть COM-объект, написанный на управляемом коде (C ++ / CLI). Я использую этот объект в стандарте C ++.

Как заставить мой COM-объект?s деструктор, который будет вызван сразу после освобождения COM-объекта? Если это'не возможно, вызов у меня Release () вызов метода MyDispose () на мой COM-объект?

Мой код для объявления объекта (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();
    };

Мой код для использования объекта (родной 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().

Если я помещаю метод деструктора в мой COM-объект, он никогда не вызывается. Если я добавляю метод финализатора, он вызывается, когда сборщик мусора обходит его. Если я явно вызываю переопределение Release (), оно никогда не вызывается.

Мне бы очень хотелось, чтобы когда мой родной объект Bar :: IFoo выходил из области видимости, он автоматически вызывал мой объект .NET »S распоряжаться кодом. Я думаю, я мог бы сделать это путем переопределения Release (), и если число объектов = 0, то вызовите MyDispose (). Но, видимо, яЯ неправильно переопределяю Release (), потому что мой метод Release () никогда не вызывается.

Очевидно, что я могу сделать это, поместив мой метод MyDispose () в интерфейс и требуя, чтобы люди, использующие мой объект, вызывали MyDispose () перед Release (), но было бы более гладко, если Release () просто очистил объект.

Можно ли форсировать COM-объект .NET?s деструктор или какой-то другой метод, который будет вызван сразу после освобождения COM-объекта?

Погуглив эту проблему, я получил много обращений, в которых говорилось, что я должен вызывать System.Runtime.InteropServices.Marshal.ReleaseComObject (), но, конечно,Как вы говорите .NET освободить COM-объект. Я хочу, чтобы COM Release () избавился от объекта .NET.

Ответы на вопрос(6)

Ваш ответ на вопрос