Я пишу приложение .NET, где мне нужно использовать вызовы API (на самом деле). Мое приложение получает COM-интерфейсы, вызывая функцию Win API CoCreateInstance()
.Есть ли у Marshal.Release() неявный ReliabilityContract?
Конечно, я должен освободить эти интерфейсы, когда закончил с ними. Я думаю, что соответствующий метод для этого - Marshal.Release()
(по крайней мере, мне не приходит в голову другой разумный метод).
Теперь я хотел бы сделать каждый указатель интерфейса безопасным. Для этого я должен получить свой собственный класс дескрипторов от SafeHandle
и должен переопределить ReleaseHandle()
в производном классе. В respective documentation состоянии:
[...] В частности, применить атрибут ReliabilityContractAttribute к любым методам вы называете от ReleaseHandle. В большинстве случаев этот код должен быть: ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success) [...]
Это моя проблема: я не знаю, если Marshal.ReleaseHandle()
уже имеет этот контракт по умолчанию, и если нет, то как я мог бы добавить его. Я думаю, что мне здесь не хватает оснований. Может ли кто-нибудь там пролить свет на него?
Windows API использует метод распределения окна, и память будет выпущена на основе правил Windows, а не правил Net Library. Только Win API, которые хранят память, должны быть выпущены с использованием метода Windows. – jdweng
Хотя это может быть правдой, я думаю, что это не относится к ситуации здесь. Существует особая ситуация с COM-интерфейсами. Мой вопрос связан с получением и выпуском COM-интерфейсов (в основном это означает увеличение и уменьшение их опорных счетчиков), а не выделение или освобождение областей памяти. В качестве примечания вы можете быть уверены, что COM-объекты сами по себе уничтожают самих себя, если контрольные счетчики для всех их интерфейсов достигли нуля (это не имеет никакого отношения к моему вопросу). – Binarus
Будет ли просто проверять код на это? Абстрактный метод имеет атрибут [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)] – Will