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的更多相关文章

随机推荐

  1. hdu 3449

    有依赖的背包,转化成01背包来做: #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  2. solr教程,值得刚接触搜索开发人员一看

    http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍sol ...

  3. HTML字符实体(Character Entities),转义字符串(Escape Sequence)

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  4. python参考手册--第8章

    1.模块和import (1)首次import module会做以下3件事: a)创建新的命名空间,用作在该源文件中定义的所有对象的容器.在模块中定义的函数和方法在使用global语句时将访问该命名空 ...

  5. python:UnicodeEncodeError

    problem: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'[taobao_cocobe ...

  6. python参考手册--第3章类型和对象

    1.对象的身份.类型.值 (1)身份:对象在内存中位置的指针,地址值, >>> a = [1,2,3,4,5] >>> id(a)48497328 >> ...

  7. codeforces #313 div1 D

    好神的题目! 首先我们运用pick定理A=S-B/2+1将要求的东西转化掉 之后分离变量,我们变成了求选取凸包面积的期望和求选取凸包在边界上的点的期望 我们先考虑求选取凸包面积的期望 如何计算凸多边形 ...

  8. java网络基本类使用(一)

    1.怎么获取ip相关信息 import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumera ...

  9. A9逻辑编译问题

    root@phone-desktop:~# cd '/opt/BARE/01led' root@phone-desktop:/opt/BARE/01led# makearm-linux-gnueabi ...

  10. JavaScript DOM高级程序设计 3.-DOM2和HTML2--我要坚持到底!

    由一个HTML进行说明,我就不敲了,直接copy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...