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.