2010-12-22 3 views
11

ich diese Funktion implementieren: GetSystemPowerStatusEx & GetSystemPowerStatusEx2Wie kann man feststellen, ob die native Methode sicher/unsicher ist?

nach diesem Artikel auf MSDN ich nach den Funktionen mit dem Namen eine Klasse erstellen soll ich verwenden, aber meine Frage ist: Wie kann ich in welcher Klasse wissen soll ich GetSystemPowerStatusEx & GetSystemPowerStatusEx2?

Ich bin verloren ...

Danke für Hilfe.

[EDIT] Meine Frage ist: Welche dieser drei Klassennamen sind die guten für mich (NativeMethods/SafeNativeMethods/UnsafeNativeMethods)?

Diese Methoden in einer der folgenden Klassen sein sollte:

Native - Diese Klasse nicht Unterdrückungs-Stack geht für nicht verwaltete Code Erlaubnis. (System.Security.SuppressUnmanagedCodeSecurityAttribute darf nicht auf diese Klasse angewendet werden.) Diese Klasse ist für Methoden, die überall verwendet werden können, da ein Stack Walk durchgeführt wird.

SafeNativeMethods - Diese Klasse unterdrückt Stackwalks für unmanaged Code-Erlaubnis. (System.Security.SuppressUnmanagedCodeSecurityAttribute wird auf diese Klasse angewendet.) Diese Klasse ist für Methoden, die für sicher sind. Anrufer dieser Methoden sind nicht erforderlich, um eine vollständige Sicherheitsüberprüfung durchzuführen, um sicherzustellen, dass die Verwendung sicher ist, da die Methoden für jeden Anrufer harmlos sind.

UnsafeNativeMethods - Diese Klasse unterdrückt Stackwalks für nicht verwaltete Codefreigabe . (System.Security.SuppressUnmanagedCodeSecurityAttribute wird auf diese Klasse angewendet.) Diese Klasse ist für potenziell gefährliche Methoden, die potenziell sind. Jeder Aufrufer dieser Methoden muss eine vollständige Sicherheitsüberprüfung zu führen, stellen Sie sicher, dass die Verwendung sicher ist, weil kein Stapel gehen durchgeführt wird.

Antwort

8

Es ist eine ziemlich dumme Warnung und letztlich unproduktiv. Aber es einfach zu halten ist einfach, fügen Sie einfach eine statische Klasse zu Ihrem Projekt namens NativeMethods hinzu und legen Sie die [DllImport] -Deklarationen darin. Keine Notwendigkeit für separate Klassen. Deklarieren Sie sie interne.

Beachten Sie, dass Sie diese Funktionen nicht auf einem Emulator aufrufen können. Wenn Sie diese Funktionen testen möchten, müssen Sie sie auf dem Gerät selbst ausführen. Um Ihr Programm im Emulator debuggbar zu halten, müssen Sie den Code, der sie aufruft, mit #ifdef DEBUG einpacken.

+0

Es ist in Ordnung, Programm läuft aber bitte meine Edit. –

+6

Verwenden Sie NativeMethods. Bis du einen * wirklich * guten Grund gefunden hast, diese Attribute anzuwenden. Wenn Microsoft Sie zum Beispiel anstellt. –

2

Erklären Sie sie einfach als statische Methoden in einer statischen Klasse; Das ist der Standardansatz.

Bearbeiten: Wie der Kommentator hervorgehoben, können sie auch in eine nicht-statische Klasse platziert werden. Solange Ihre Win32-Methoden statisch extern mit einem DLLImport-Attribut sind, können sie praktisch in jeder Klasse ausgeführt werden.

+0

Sie können auch in eine nicht-statische Klasse gesetzt werden. –

+0

Sicher, sie können überall wirklich platziert werden. Der Standardansatz, den ich gesehen habe, ist statisch im statischen Bereich, aber ich denke, die wirkliche Antwort ist, das ist egal. –

+1

Ich stimme zu, ich schreibe immer auch eine Wrapper-Funktion für sie. So kann ich sie bei Bedarf leicht ersetzen oder modifizieren. – Bobby

0

Setzen Sie sie innerhalb der Klasse, die Sie als statische Methoden verwenden werden, und wickeln Sie sie dann mit normalen Methoden um, so dass Sie den Rest der Anwendung nicht mit der Vorstellung belästigen, dass etwas Äußeres involviert ist.

Ich benutze diesen Ansatz und es scheitert nie.

EDIT:

Check this out:

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

+0

Es ist in Ordnung, Programm läuft aber bitte meine Edit. –