2017-02-08 11 views
1

Я пишу приложение .NET, где мне нужно использовать вызовы API (на самом деле). Мое приложение получает COM-интерфейсы, вызывая функцию Win API CoCreateInstance().Есть ли у Marshal.Release() неявный ReliabilityContract?

Конечно, я должен освободить эти интерфейсы, когда закончил с ними. Я думаю, что соответствующий метод для этого - Marshal.Release() (по крайней мере, мне не приходит в голову другой разумный метод).

Теперь я хотел бы сделать каждый указатель интерфейса безопасным. Для этого я должен получить свой собственный класс дескрипторов от SafeHandle и должен переопределить ReleaseHandle() в производном классе. В respective documentation состоянии:

[...] В частности, применить атрибут ReliabilityContractAttribute к любым методам вы называете от ReleaseHandle. В большинстве случаев этот код должен быть: ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success) [...]

Это моя проблема: я не знаю, если Marshal.ReleaseHandle() уже имеет этот контракт по умолчанию, и если нет, то как я мог бы добавить его. Я думаю, что мне здесь не хватает оснований. Может ли кто-нибудь там пролить свет на него?

+0

Windows API использует метод распределения окна, и память будет выпущена на основе правил Windows, а не правил Net Library. Только Win API, которые хранят память, должны быть выпущены с использованием метода Windows. – jdweng

+0

Хотя это может быть правдой, я думаю, что это не относится к ситуации здесь. Существует особая ситуация с COM-интерфейсами. Мой вопрос связан с получением и выпуском COM-интерфейсов (в основном это означает увеличение и уменьшение их опорных счетчиков), а не выделение или освобождение областей памяти. В качестве примечания вы можете быть уверены, что COM-объекты сами по себе уничтожают самих себя, если контрольные счетчики для всех их интерфейсов достигли нуля (это не имеет никакого отношения к моему вопросу). – Binarus

+1

Будет ли просто проверять код на это? Абстрактный метод имеет атрибут [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)] – Will

ответ

2

Определение абстрактного метода Marshal.Release является

[System.Security.SecurityCritical] // auto-generated_required 
[ResourceExposure(ResourceScope.None)] 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
public static extern int /* ULONG */ Release(IntPtr /* IUnknown */ pUnk); 

Так он уже украшен ReliabilityContractAttribute. Вы можете проверить источник любого типа фреймворка с помощью декомпилятора (я использовал JustDecompile) или более на referencesource.microsoft.com.

+0

Принимая ответ, хотя вы, вероятно, хотели показать код 'Marshal.Release()' (вместо 'SafeHandle.ReleaseHandle()') :-) – Binarus

+0

@Binarus Hah! Да, я обернулся. Обновлено. – Will

 Смежные вопросы

  • Нет связанных вопросов^_^