如何知道原生方法是安全/不安全的?

时间:2010-12-22 16:41:03

标签: c# interop

我实现了这个功能:GetSystemPowerStatusEx& GetSystemPowerStatusEx2

根据MSDN上的这篇文章,我应该创建一个根据我将使用的函数命名的类,但我的问题是:我怎么知道我应该把哪个类放入GetSystemPowerStatusEx& GetSystemPowerStatusEx2?

我迷路了......

感谢您的帮助。

[编辑] 我的问题是:这三个类名中哪一个对我来说是好的(NativeMethods / SafeNativeMethods / UnsafeNativeMethods)?

  

这些方法应该属于以下类别之一:

     

NativeMethods - 此类没有   抑制堆栈走动为非托管   代码许可。   (System.Security.SuppressUnmanagedCodeSecurityAttribute   不得应用于此课程。)   这个类适用于可以的方法   因为堆栈走路而在任何地方使用   将会进行。

     

SafeNativeMethods - 这个类   抑制不受管理的堆栈遍历   代码许可。   (System.Security.SuppressUnmanagedCodeSecurityAttribute   适用于这个类。)这个类   适用于安全的方法   任何人打电话。这些来电者   方法不需要执行   完整的安全审查,以确保   使用是安全的,因为   方法对任何来电者都无害。

     

UnsafeNativeMethods - 这个类   抑制不受管理的堆栈遍历   代码许可。   (System.Security.SuppressUnmanagedCodeSecurityAttribute   适用于这个类。)这个类   适用于潜在的方法   危险的。这些方法的任何调用者   必须执行完整的安全审查   确保使用安全   因为没有堆栈走路   进行。

3 个答案:

答案 0 :(得分:9)

这是一个非常愚蠢的警告,最终没有效果。但保持它的快乐很简单,只需在名为NativeMethods的项目中添加一个静态类,并将[DllImport]声明放入其中。不需要单独的课程。声明他们内部

请注意,您无法在模拟器上调用这些函数,测试它们需要在设备上运行它。要使程序在模拟器中可调试,请确保使用#ifdef DEBUG包装调用它们的代码。

答案 1 :(得分:2)

只需将它们声明为静态类中的静态方法;这是标准方法。

编辑:与评论者指出的一样,它们也可以放在非静态类中。从本质上讲,只要你的Win32方法是带有DLLImport属性的静态extern,它们就可以在任何类中使用。

答案 2 :(得分:0)

将它们放在要将它们作为静态方法使用的类中,然后使用常规方法将它们包裹起来,这样你就不会打扰应用程序的其余部分,并认为存在一些外部因素。

我使用这种方法,它永远不会失败。

编辑:

检查出来:

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