CLR 集成编程模型限制
生成托管存储过程或其他托管数据库对象时,需要考虑SQL Server执行某些代码检查。 SQL Server首次在数据库中注册托管代码程序集时,使用 CREATE ASSEMBLY 语句执行检查,并在运行时执行检查。 在运行时也将检查托管代码,这是因为在程序集中,也许存在在运行时实际上可能永远无法访问的代码路径。 这样一来,在注册第三方程序集时尤其灵活,因为,当存在专门在客户端环境下运行而从不在承载的 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<位置>,并且所有引用的程序集及其依赖项都在位置>中<可用。
您使用的是 CREATE ASSEMBLY FROM<字节 ...>, 并且所有引用都通过空格分隔的字节指定。
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 条件。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈