Как узнать, является ли нативный метод безопасным / небезопасным? - PullRequest
12 голосов
/ 22 декабря 2010

Я реализую эту функцию: GetSystemPowerStatusEx & GetSystemPowerStatusEx2

в соответствии с этой статьей на MSDN , я должен создать класс с именем в соответствии сфункции, которые я буду использовать, но мой вопрос: как я могу узнать, в какой класс я должен поместить GetSystemPowerStatusEx & GetSystemPowerStatusEx2?

Я потерян ...

Спасибо за помощь.

[EDIT] Мой вопрос: какое из этих трех названий классов мне подходит (NativeMethods / SafeNativeMethods / UnsafeNativeMethods)?

Эти методы должны бытьв одном из следующих классов:

NativeMethods - этот класс не запрещает обход стека для разрешения неуправляемого кода.(System.Security.SuppressUnmanagedCodeSecurityAttribute не должен применяться к этому классу.) Этот класс предназначен для методов, которые могут использоваться где угодно, поскольку будет выполняться обход стека.

SafeNativeMethods - этот класс подавляет обход стека для разрешения неуправляемого кода,(System.Security.SuppressUnmanagedCodeSecurityAttribute применяется к этому классу.) Этот класс предназначен для методов, которые безопасны для вызова всеми.Вызывающие эти методы не обязаны выполнять полную проверку безопасности, чтобы убедиться, что использование безопасно, потому что методы безвредны для любого вызывающего абонента.

UnsafeNativeMethods - этот класс подавляет обход стека для разрешения неуправляемого кода.(System.Security.SuppressUnmanagedCodeSecurityAttribute применяется к этому классу.) Этот класс предназначен для потенциально опасных методов.Любой вызывающий из этих методов должен выполнить полную проверку безопасности, чтобы убедиться, что использование безопасно, потому что обход стека не будет.

Ответы [ 3 ]

9 голосов
/ 22 декабря 2010

Это довольно глупое предупреждение и в конечном итоге непродуктивно. Но поддерживать его просто - просто добавьте статический класс в ваш проект с именем NativeMethods и поместите в него объявления [DllImport]. Нет необходимости в отдельных классах. Объявить их внутренний .

Помните, что вы не можете вызывать эти функции на эмуляторе, для их тестирования потребуется запуск его на самом устройстве. Чтобы сохранить отладку вашей программы в эмуляторе, обязательно оберните код, который вызывает их, в #ifdef DEBUG.

2 голосов
/ 22 декабря 2010

Просто объявите их как статические методы в статическом классе; это стандартный подход.

Редактировать: Как указывал комментатор, они также могут быть помещены в нестатический класс. По сути, если ваши методы Win32 статические extern с атрибутом DLLImport, они могут использоваться практически в любом классе.

0 голосов
/ 22 декабря 2010

Поместите их в класс, который вы собираетесь использовать в качестве статических методов, затем оберните их обычными методами, чтобы не беспокоить остальную часть приложения, полагая, что в этом есть что-то внешнее.

Я использую этот подход, и он никогда не выходит из строя.

РЕДАКТИРОВАТЬ:

Проверьте это:

http://pinvoke.net/search.aspx?search=GetSystemPowerStatusEx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...