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


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

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

我迷路了...

感谢帮助。

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

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

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

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

UnsafeNativeMethods - 这个类   抑制堆栈散步为非托管   代码权限。   (System.Security.SuppressUnmanagedCodeSecurityAttribute   适用于这个类。)这个类   适用于潜在的方法   危险的。这些方法的任何调用者   必须执行完整的安全审查   确保使用安全   因为没有堆栈走路   执行。


3866
2017-12-22 16:41


起源



答案:


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

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


8
2017-12-22 17:07



没关系,程序运行但请看我的编辑。 - Arnaud F.
使用NativeMethods。直到找到一个 真 有充分理由应用这些属性。当微软聘请你的时候。 - Hans Passant


答案:


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

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


8
2017-12-22 17:07



没关系,程序运行但请看我的编辑。 - Arnaud F.
使用NativeMethods。直到找到一个 真 有充分理由应用这些属性。当微软聘请你的时候。 - Hans Passant


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

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


2
2017-12-22 16:43



它们也可以放在非静态类中。 - Danny Chen
当然,他们可以放在任何地方。我所看到的标准方法是静态静态,但我猜真正的答案是,无所谓。 - Szymon Rozga
我同意,我也总是为他们写一个包装函数。这样我就可以在必要时轻松替换或修改它们。 - Bobby
没关系,程序运行但请看我的编辑。 - Arnaud F.


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

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

编辑:

看一下这个:

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


0
2017-12-22 16:56



没关系,程序运行但请看我的编辑。 - Arnaud F.