Как реализовать Dispose в COM-объекте - PullRequest
0 голосов
/ 15 мая 2009

Я написал COM-компонент на неуправляемом C ++, чтобы предоставить клиентам доступ к нашей базе данных. При использовании его из неуправляемого языка соединения с базой данных корректно очищаются, так как объекты выходят из области видимости. Недавно я попытался использовать его из VB.NET и обнаружил, что COM-объекты не уничтожаются. Рассеяние вызовов System.Runtime.InteropServices.Marshal.ReleaseComObject решает проблему, но я хотел бы найти более простое и безопасное решение для исключений, поскольку этот COM-объект предназначен для использования пользователем.

Похоже, что правильное решение состоит в том, чтобы управляемые объекты реализовали IDisposeable , поэтому можно использовать оператор , использующий , автоматически вызывая Dispose , когда объект больше не требуется.

Как мне реализовать IDisposeable для подмножества моих объектов? Некоторые из объектов, которые требуют утилизации, не могут быть созданы совместно, но возвращаются другими функциями.

Ответы [ 2 ]

2 голосов
/ 27 мая 2009

Вы можете использовать оболочки .NET, как предлагает 1800 INFORMATION, затем не забывайте всегда использовать их с оператором использования, как вы сказали:

using( var connection = GetDisposableConnection() )
{
    //do stuff
}

Если это не работает, потому что что-то не было выпущено правильно, вы можете вставить эти строки при выключении:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
2 голосов
/ 15 мая 2009

Безумие таково. Вам лучше будет обернуть ваши COM-объекты в безопасные .Net-оболочки типа, которые реализуют IDisposable (если хотите), или использовать обычные методы .Net-сборки мусора для очистки.

...