【问题标题】:How to know if native method is safe / unsafe?如何知道本机方法是否安全/不安全?
【发布时间】:2010-12-22 16:41:03
【问题描述】:

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

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

我迷路了……

感谢您的帮助。

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

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

NativeMethods - 这个类不 抑制非托管的堆栈遍历 代码权限。 (System.Security.SuppressUnmanagedCodeSecurityAttribute 不得应用于此类。) 这个类是用于方法的 在任何地方使用,因为堆栈步行 将被执行。

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

UnsafeNativeMethods - 这个类 抑制非托管的堆栈遍历 代码权限。 (System.Security.SuppressUnmanagedCodeSecurityAttribute 应用于此类。)此类 适用于潜在的方法 危险的。这些方法的任何调用者 必须进行全面的安全审查,以 确保使用安全 因为没有堆栈遍历 执行。

【问题讨论】:

    标签: c# interop


    【解决方案1】:

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

    请注意,您不能在模拟器上调用这些函数,测试它们需要在设备本身上运行。为了让您的程序在模拟器中可调试,请务必使用#ifdef DEBUG 包装调用它们的代码。

    【讨论】:

    • 没关系,程序运行,但请看我的编辑。
    • 使用 NativeMethods。直到您找到真正应用这些属性的好理由。例如,当 Microsoft 雇用你时。
    【解决方案2】:

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

    编辑:就像评论者指出的那样,它们也可以放在非静态类中。本质上,只要您的 Win32 方法是具有 DLLImport 属性的静态 extern,它们几乎可以用于任何类。

    【讨论】:

    • 它们也可以放在非静态类中。
    • 当然,它们真的可以放在任何地方。我看到的标准方法是静态的,但我想真正的答案是,没关系。
    • 我同意,我也总是为它们编写一个包装函数。这样我就可以在必要时轻松替换或修改它们。
    • 没关系,程序运行但请看我的编辑。
    【解决方案3】:

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

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

    编辑:

    看看这个:

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

    【讨论】:

    • 没关系,程序运行但请看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2017-05-16
    • 2023-03-10
    • 2012-06-05
    相关资源
    最近更新 更多