CLR via C# 读书笔记1-4 追记

23 篇文章 0 订阅

IL 的验证

IL 提升了程序的强壮性和安全性,当IL 转换成本地 CPU 指令时, CLR 会进行一个验证的处理。这个验证处理保证了 IL 代码所干的事情是安全的。比如:每个被调用方法的参数是匹配的,返回值被正确使用,函数结尾有 return 语句等等。
在 Windows 中每个进程都有其自己的虚拟地址空间,这样设计的初衷是防止一个进程错误的读写到另一个进程的内存空间而引起的安全性问题。
托管代码经过验证后,能够确保这些代码的内存访问不会对其他程序造成影响,这也意味着你可以在同一个Windows 虚拟地址空间中运行多个托管程序。
由于 Windows 进程会消耗许多操作系统资源,建立太多的进程就会影响到性能并减少可用资源。所以通过在一个系统进程中运行多个程序的方法可以通过减少进程数从而提高整体系统的运行效率。

Unsafe 代码

Microsoft 的 C# 编译器允许 unsafe 代码,这些代码被允许直接通过内存地址访问数据,这个强大的机能在你需要改进耗时运算效率特别有用。

但是这也会带来一些风险: unsafe 代码能破化数据结构而带来安全性问题。所以 C# 编译器强制要求这些包含 unsafe 代码的方法带上 unsafe 关键字,并且在编译时带上 /unsafe 编译开关。当 JIT 编译器尝试编译 unsafe 方法时,它首先检查程序集是否具有System.Security.Permissions.SecurityPermissionFlag 的 SkipVerification 标记。如果有则编译这些 unsafe 代码并允许执行,反之 JIT 编译器掷出 System.InvalidProgramException 或 System.Security.VerificationException 异常(程序被终止)。
默认情况下,从本地或共享网络路径上装载而来的程序集被赋予所有权限,即他们可以做任何操作包括运行 unsafe 代码;从Internet上装载而来的程序集没有被赋予运行 unsafe 代码的权限,运行unsafe 代码会掷出异常。(管理员可以变更这些默认设定)

Microsoft 提供一个名为 PEVerify.exe 的工具来检查一个程序集的所有方法,并提示包含了unsafe 代码的方法。

保护你的知识产权
IL相当容易被(类似IL Disassembler的工具)反编译,被反向工程后的代码会暴露程序的处理流程。当你开发server端的程序时问题还不大,但当把程序配布到客户机上时就会有被反编译的可能。这时你可以使用混淆工具,它会变更你程序集中所有私有类型的名称,使得被编译后的代码很难理解。当然这样的保护也相当的有限,所以你可以进一步把你的核心处理采用非托管代码编码,然后在托管代码中调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值