C# 中的 NativeMethods 类有什么作用?

hat*_*enn 5 c# pinvoke native-methods

可能的重复:
NativeMethods 类是否在 .NET 中进行了特殊处理?

我正在开发一个 C# 项目,该项目为某些功能调用一些非托管 C++ 代码。我发现了 fxCop,它抱怨我包含非托管库中的函数的方式。

它建议使用 NativeMethods 类之一,解释如下:

http://msdn.microsoft.com/en-us/library/ms182161%28v=vs.80%29.aspx

我读过它,但我不能说我理解它的确切作用以及使用它的好处是什么。如果有人能向我解释“此类不会抑制非托管代码权限的堆栈遍历”的含义,我会非常高兴。和“此类抑制非托管代码权限的堆栈遍历。”

编辑:我真正想知道的是它如何影响我的代码。我在 MSDN 上读过它的内容,显然这对某些人来说已经足够了,但对我来说太高了,无法理解。这就是为什么我要求进行一些详细说明。

Lex*_* Li 2

本文的 Visual Studio 2012 版本包含更多解释,

http://msdn.microsoft.com/en-us/library/ms182161(v=vs.110).aspx

要修复违反此规则的问题,请将该方法移至适当的 NativeMethods 类。对于大多数应用程序,将 P/Invokes 移至名为 NativeMethods 的新类就足够了。

但是,如果您正在开发供其他应用程序使用的库,则应考虑定义另外两个类,分别称为 SafeNativeMethods 和 UnsafeNativeMethods。这些类类似于 NativeMethods 类;但是,它们是通过使用名为 SuppressUnmanagedCodeSecurityAttribute 的特殊属性来标记的。应用此属性时,运行时不会执行完整的堆栈遍历以确保所有调用者都具有 UnmanagedCode 权限。运行时通常会在启动时检查此权限。由于不执行检查,因此可以极大地提高调用这些非托管方法的性能,还使得具有有限权限的代码能够调用这些方法。

但是,您应该非常小心地使用此属性。如果实施不正确,可能会产生严重的安全隐患。

有关如何实现这些方法的信息,请参阅 NativeMethods 示例、SafeNativeMethods 示例和 UnsafeNativeMethods 示例。