Есть ли у 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/.

Другие вопросы по тегам