类型安全和安全性
类型安全代码只访问被授权可以访问的内存位置。(在本讨论中,类型安全特指内存类型安全,不应与范围更广的类型安全混淆。)例如,类型安全代码不能从其他对象的私有字段读取值。 它只以定义完善的允许方式访问类型。
在实时 (JIT) 编译期间,可选的验证过程检查要实时编译为本机代码的方法的元数据和 Microsoft 中间语言 (MSIL),以验证它们是否为类型安全。 如果代码具有忽略验证的权限,则将跳过此过程。 有关验证的更多信息,请参见托管执行过程。
尽管类型安全验证对于运行托管代码不是强制的,但类型安全在程序集隔离和安全性强制中起着至关重要的作用。 如果代码是类型安全的,则公共语言运行时可以将程序集彼此间完全隔离。 这种隔离有助于确保程序集之间不会产生负面影响,且提高应用程序的可靠性。 即使类型安全组件的信任级别不同,它们也可以在同一过程中安全地执行。 如果代码不是类型安全的,则会出现不需要的副作用。 例如,运行时无法阻止托管代码调用到本机(非托管)代码中和执行恶意操作。 当代码是类型安全时,运行时的安全性强制机制确保代码不会访问本机代码,除非它有访问本机代码的权限。 所有非类型安全的代码都必须通过传递的枚举成员 SkipVerification 授予SecurityPermission 后才能运行。
类型安全代码是仅以定义完善的、允许的方式访问类型的代码。 例如,给定有效的对象引用,类型安全代码可以按对应于实际字段成员的固定偏移量来访问内存。但是,如果代码以任意偏移量访问内存,该偏移量超出了属于该对象的公开字段的内存范围,则它就不是类型安全的代码。
实时 (JIT) 编译执行称为验证的过程,该过程检查代码并尝试确定该代码是否为类型安全代码。 验证过程中被证明属于类型安全的代码称为可验证为类型安全的代码。 代码可以是类型安全代码,但可能不是可验证为类型安全的代码,原因在于验证过程或编译器的限制。 并非所有的语言都是类型安全的,有些语言编译器(如 Microsoft Visual C++)无法生成可验证为类型安全的代码。 若要确定所使用的语言编译器是否生成可验证为类型安全的代码,请参见编译器的文档。 如果使用的语言编译器只在您不使用某些语言构造时才生成可验证为类型安全的代码,则可能需要使用 Windows 软件开发包 (SDK) PEVerify 工具来确定代码是否是可验证为类型安全的代码。
如果安全策略允许未被验证为类型安全的代码跳过验证,则可尝试执行此类代码。 但是,因为类型安全是运行时用于分离程序集的机制的重要部分,所以,如果代码违背类型安全的规则,就不能可靠地实施安全性。 默认情况下,只允许运行从本地计算机生成的非类型安全代码。 因此,移动代码应该是类型安全代码。