首页 > 代码库 > CA1060
CA1060
Move P/Invokes to NativeMethods class
规则描述:
平台调用服务访问非托管代码。
平台调用方法(使用了System.Runtime.InteropServices.DllImportAttribute特性访问非托管代码的方法),需要放到NativeMethods,SafeNativeMethods,UnsafeNativeMethods 类中的一个中。
1.NativeMethods:会做堆栈审查(stack walk)。对于可能在各个地方使用的方法,放到这个类中。System.Security.SuppressUnmanagedCodeSecurityAttribute特性不能应用到这个类。
2.SafeNativeMethods:不会(suppress)做堆栈审查(stack walk)。对于任何人的调用都是安全的方法,放到这个类中。System.Security.SuppressUnmanagedCodeSecurityAttribute特性应用到这个类。方法的调用者不需要做完整的安全审查保证它的使用是安全的,因为方法对于调用者是无害的(harmless)。
3.UnsafeNativeMethods :不会(suppress)做堆栈审查(stack walk)。对于有潜在危险的方法,放到这个类中。System.Security.SuppressUnmanagedCodeSecurityAttribute特性应用到这个类。方法的调用者需要做完整的安全审查保证它的使用是安全的,因为堆栈审查不会执行。
这些类被定义成internal并且声明私有的构造函数来阻止新的实例被创建。内部定义的方法必须是static和internal。
解决冲突:
将方法移到上述三个类中合适的一个中。对于大多数的应用程序,将方法移到以NativeMethods命名的类中就足够了。
如果在开发一个被其他应用使用的应用程序库,那么需要考虑创建另外两个类。这两个类和NativeMethods很像,不过会被SuppressUnmanagedCodeSecurityAttribute特性所标记。有这个特性的话,运行时不会执行完整的堆栈审查来确保调用者有非托管代码权限(the UnmanagedCode permission)。一般仅在启动的时候检查。由于不检查,会显著提高调用非托管代码的性能。也会允许只有有限权限的代码使用这些方法。使用这个特性必须小心。不正确使用会带来严重的安全问题(serious security implications)。
我的认识:
对于这种与平台调用相关的方法不要放在其他的类中,而是封装在这三个类中。这样代码更清晰。
CA1060