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的更多相关文章
随机推荐
- 汇编invoke和call的关系
win32汇编里面,我们既可以用invoke也可以用call调用子程序/函数,不过invoke使用简单方便,所以绝大多数情况我们都用invoke. 但是很多人只是知道使用它,对它却不是很了解.我以前对 ...
- SSH架构简单总结
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forw ...
- 分析java程序中cpu占用过高的线程
http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...
- zoj 3380 Patchouli's Spell Cards 概率DP
题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...
- linux和window下mkdir函数
通过WIN32宏进行判断 window下mkdir函数 #include<direct.h> int _mkdir( const char *dirname ); linux下 ...
- eclipse实现JavaWeb应用增量打包
很多情况下,项目是不允许全量发布的,所以你得把有做修改的文件一个个挑出来,如果有成千上百的文件,你是不是要头大了? 以下方法应该可以让你得到解救!前提是你是用装有svn plugin的eclipse上 ...
- QT插件开发方式(作者有RemOjbects文档翻译(48)篇)
创建一个QT的库项目,删除自动生成的.h和.cpp文件,添加一个接口定义.h文件和一个接口实现类(一个.h一个.cpp).代码如下: 1.接口文件源码 #ifndef PLUGININTERFACE_ ...
- *J2EE中乱码处理
发生中文乱码有三种情况 表单form (1)post 首先确定浏览器的编码方式,比如说utf-8,请求发给web服务器,web服务器以编码方式iso-9959-1来接收数据(服务器是外国人编写的),服 ...
- Android Paint中setTextSize
界面适配的时候发现Paint.setTextSize与TextView.setTextSize传入的单位不一致.Paint.setTextSize传入的单位是px,TextView.setTextSi ...
- JavaScript定时器详解及实例
JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延迟一段时间,再进行某项操作. setTimeout("function& ...