Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know if native method is safe / unsafe?

Tags:

c#

interop

I implement this function : GetSystemPowerStatusEx & GetSystemPowerStatusEx2

according to this article on MSDN, I should create a class named according to the functions I will use, but my question is : How can I know in which class I should put GetSystemPowerStatusEx & GetSystemPowerStatusEx2 ?

I'm lost...

Thanks for help.

[EDIT] My question is : which of these three class names are the good one for me (NativeMethods / SafeNativeMethods / UnsafeNativeMethods) ?

These methods should be in one of the following classes:

NativeMethods - This class does not suppress stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute must not be applied to this class.) This class is for methods that can be used anywhere because a stack walk will be performed.

SafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are safe for anyone to call. Callers of these methods are not required to perform a full security review to make sure that the usage is secure because the methods are harmless for any caller.

UnsafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are potentially dangerous. Any caller of these methods must perform a full security review to make sure that the usage is secure because no stack walk will be performed.

like image 430
Arnaud F. Avatar asked Dec 22 '10 16:12

Arnaud F.


2 Answers

It's a pretty silly warning and ultimately unproductive. But keeping it happy is simple, just add a static class to your project named NativeMethods and put the [DllImport] declarations inside it. No need for separate classes. Declare them internal.

Beware that you cannot call these functions on an emulator, testing them is going to require running it on the device itself. To keep your program debuggable in the emulator be sure to wrap the code that calls them with #ifdef DEBUG.

like image 55
Hans Passant Avatar answered Oct 21 '22 17:10

Hans Passant


Just declare them as static methods in a static class; that is the standard approach.

Edit: Like the commenter pointed out, they can be placed in a non-static class as well. Essentially, as long as your Win32 methods are static extern with a DLLImport attribute, they can go pretty much in any class.

like image 45
Szymon Rozga Avatar answered Oct 21 '22 18:10

Szymon Rozga