CLR 集成编程模型限制

生成托管存储过程或其他托管数据库对象时,需要考虑一些通过 SQL Server 执行的特定代码检查。在数据库中首次使用 CREATE ASSEMBLY 注册托管代码程序集时,SQL Server 将会对该托管代码程序集执行检查,且在运行时也会执行此检查。在运行时也将检查托管代码,这是因为在程序集中,也许存在在运行时实际上可能永远无法访问的代码路径。这样一来,在注册第三方程序集时尤其灵活,因为,当存在专门在客户端环境下运行而从不在承载的 CLR 中执行的“不安全”代码时,不会阻塞程序集。托管代码必须满足的要求取决于程序集是注册为 SAFE、EXTERNAL_ACCESS 还是 UNSAFE(其中 SAFE 是最严格的),且在下表中列出。

除了对托管代码程序集进行了限制,还授予了一些代码安全权限。公共语言运行时 (CLR) 支持称为代码访问安全性 (CAS) 的托管代码安全模式。在这种模式下,根据代码的标识来对程序集授予权限。SAFE、EXTERNAL_ACCESS 和 UNSAFE 程序集具有不同的 CAS 权限。有关详细信息,请参阅CLR 集成代码访问安全性

CREATE ASSEMBLY 检查

运行 CREATE ASSEMBLY 语句时,将为每个安全级别执行以下检查。如果有任何检查失败,则 CREATE ASSEMBLY 也将失败,且显示一条错误消息。

全局(任何安全级别)

所有被引用的程序集都必须满足下列一个或多个条件:

  • 程序集已在数据库中注册。

  • 程序集是受支持的程序集之一。有关详细信息,请参阅支持的 .NET Framework 库

  • 您使用的是 CREATE ASSEMBLY FROM<location>, 且所有被引用的程序集及其依赖项均在 <location> 中可用。

  • 您使用的是 CREATE ASSEMBLY FROM<bytes …>, 且所有引用均通过空格分隔的字节指定。

EXTERNAL_ACCESS

所有 EXTERNAL_ACCESS 程序集都必须满足以下条件:

  • 静态字段不用来存储信息。允许只读静态字段。

  • PEVerify 测试通过。PEVerify 工具 (peverify.exe) 随 .NET Framework SDK 一起提供,该工具可检查 MSIL 代码及关联元数据是否满足类型安全要求。

  • 不使用同步,例如与 SynchronizationAttribute 类的同步。

  • 不使用终结器方法。

在 EXTERNAL_ACCESS 程序集中不允许以下自定义属性:

  • System.ContextStaticAttribute

  • System.MTAThreadAttribute

  • System.Runtime.CompilerServices.MethodImplAttribute

  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  • System.Runtime.Remoting.Contexts.ContextAttribute

  • System.Runtime.Remoting.Contexts.SynchronizationAttribute

  • System.Runtime.InteropServices.DllImportAttribute

  • System.Security.Permissions.CodeAccessSecurityAttribute

  • System.Security.SuppressUnmanagedCodeSecurityAttribute

  • System.Security.UnverifiableCodeAttribute

  • System.STAThreadAttribute

  • System.ThreadStaticAttribute

SAFE

  • 检查所有 EXTERNAL_ACCESS 程序集条件。

运行时检查

在运行时,将针对下列条件检查代码程序集。如果发现任何一个条件,则将不允许托管代码运行,且将会引发异常。

UNSAFE

不允许通过从字节数组调用 System.Reflection.Assembly.Load() 方法显式加载程序集,也不允许通过使用 Reflection.Emit 命名空间隐式加载程序集。

EXTERNAL_ACCESS

检查所有 UNSAFE 条件。

在支持的程序集列表中不允许所有使用以下宿主保护属性 (HPA) 值批注的类型和方法。

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

有关 HPA 以及支持的程序集中不允许的类型和成员列表的详细信息,请参阅宿主保护属性和 CLR 集成编程

SAFE

检查所有 EXTERNAL_ACCESS 条件。