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的更多相关文章
随机推荐
- hdu 4648
求一个数列中 去掉一些连续的数之后 不改变对m取余后的值 就是求一个最长的连续子序列 对m取余后为0 我的方法可能比较水 #include<iostream> #include<c ...
- POJ3034+DP
题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现 出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能 够移动锤子, ...
- cocos2dx addchild坐标问题
a.addchild(b); 会把a->getBoundingBox矩形的左下角坐标点和b的锚点贴合在一起. ----- 其他引擎默认不是这样的,所以再跨平台导数据的时候,要注意这些细微的差别 ...
- 分布式设计与开发(三)------高一致性服务ZooKeeper
分布式环境中大多数服务是允许部分失败,也允许数据不一致,但有些最基础的服务是需要高可靠性,高一致性的,这些服务是其他分布式服务运转的基础,比如naming service.分布式lock等,这些分布式 ...
- Qt之启动外部程序(调用cmd.exe ping putty winscp 管道等等,比较牛叉)
http://blog.csdn.net/u011012932/article/details/50478833
- CityEngine 2013部署安装
安装环境: windows8.1 专业版 已安装arcgis10.2 2的授权方式也同样分为:单机许可和浮动 许可.单机许可是将许可部署在本机直接使用:浮动许可是部署到服务器上通过IP地址连接,可借出 ...
- 验证Android用户输入日期
如何验证用户输入的日期是有效还是无效? private Pattern pattern; private Matcher matcher; private static final String DA ...
- Revit 二次开发 沿弧形路径创建拉伸屋顶
沿弧形路径创建拉伸屋顶 Revit的API中只能按照直线创建拉伸屋顶,不能按照曲线创建拉伸屋顶.在Revit的界面当中,可以用 构建->内建模型,进行放样创建屋顶.但是没有办法代码内建模型. 可 ...
- Uploadify参数详解
属性 $('#file_upload').uploadify({ //一属性详解 id: jQuery(this).attr('id'),//绑定的input的ID la ...
- Go语言Revel框架 环境搭建
1.首先参考连个链接 http://blog.csdn.net/creak_phone/article/details/12620969 http://www.geek521.com/?p=616 2 ...