В замечательной программе FxCop с версии 1.312 появилось новое правило:
MovePInvokesToNativeMethodsClass.
Оно советует распределить все объявления внешних unmanaged функций по трём классам:
SafeNativeMethods, NativeMethods и UnsafeNativeMethods.
Microsoft более менее чётко придерживается этого правила в BCL .Net Framework.
Классы различаются следующим:
SafeNativeMethods - к классу применяется аттрибут [SuppressUnmanagedCodeSecurity].
О безопасности вызовов можно не думать вообще.
NativeMethods - к классу не применяется аттрибута [SuppressUnmanagedCodeSecurity].
В этот класс обычно попадают константы и типы данных (почему methods - не знаю).
UnsafeNativeMethods - к классу применяется аттрибут [SuppressUnmanagedCodeSecurity].
О безопасности вызовов думает непосредственно производящий вызов.
Под безопасностью имеются в виду проверки "клиента" нашей библиотеки на наличие необходимых прав.
Самое интересное в этой истории - аттрибут [SuppressUnmanagedCodeSecurity].
Без FxCop я бы нескоро задумался о том, зачем он нужен.
А он, на самом деле, очень и очень полезен.
Этот аттрибут применяется к классу, содержащему методы P/Invoke или непосредственно к методу.
Он отключает полную проверку стека на permission обращения к unmanaged коду.
Да-да. Если его не применить, каждый вызов метода P/Invoke будет приводит к полному просмотру стека !
Мелочь, но производится эта проверка вовсе не мгновенно.
Так что MovePInvokesToNativeMethodsClass !
<обновляемая версия:
MovePInvokesToNativeMethodsClass@npj>