Есть ли у Marshal.Release() неявный элемент ReliabilityContract?
Я пишу приложение.NET, где я должен использовать вызовы API (на самом деле). Мое приложение получает интерфейсы COM, вызывая функцию Win API CoCreateInstance()
,
Конечно, я должен освободить эти интерфейсы, когда закончу с ними. Я думаю, что подходящий способ сделать это Marshal.Release()
(по крайней мере, никакой другой разумный метод не приходит мне в голову).
Теперь я хотел бы сделать каждый соответствующий указатель интерфейса безопасным дескриптором. Чтобы сделать это, я должен извлечь свой собственный класс безопасной ручки из SafeHandle
и должны переопределить ReleaseHandle()
в производном классе. Соответствующая документация гласит:
[...] В частности, примените атрибут ReliabilityContractAttribute к любым методам, которые вы вызываете из ReleaseHandle. В большинстве случаев этот код должен быть: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success) [...]
Это моя проблема: я не знаю, если Marshal.ReleaseHandle()
уже есть этот контракт по умолчанию, и если нет, то как я мог бы добавить его. Я думаю, что мне не хватает некоторых основ здесь. Может ли кто-нибудь там пролить свет на это?
1 ответ
Определение абстрактного метода 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) или по адресу https://referencesource.microsoft.com/.