Restricciones del modelo de programación de la integración CLR

Cuando se está generando un procedimiento almacenado administrado u otro objeto de base de datos administrado, SQL Server realiza ciertas comprobaciones de código que hay que considerar. SQL Server realiza comprobaciones en el ensamblado de código administrado cuando se registra primero en la base de datos, mediante la instrucción CREATE ASSEMBLY y también en tiempo de ejecución. El código administrado también se comprueba en tiempo de ejecución porque en un ensamblado puede haber rutas de acceso al código que nunca se hayan alcanzado realmente en tiempo de ejecución. Esto proporciona flexibilidad para registrar ensamblados de terceros, de manera especial, de forma que no se debe bloquear un ensamblado donde haya un código 'no seguro' diseñado para que se ejecute en un entorno cliente pero nunca se ejecutaría en el CLR alojado. Los requisitos que el código administrado debe cumplir dependen de si el ensamblado se registra como SAFE, EXTERNAL_ACCESS o UNSAFE, SAFE que es el más estricto, y se enumeran a continuación.

Además de las restricciones que se ubican en los ensamblados de código administrado, también hay permisos de seguridad de código que se conceden. Common Language Runtime (CLR) admite un modelo de seguridad denominado seguridad de acceso a código (CAS) para el código administrado. En este modelo, se conceden permisos a los ensamblados basados en la identidad del código. Los ensamblados SAFE, EXTERNAL_ACCESS y UNSAFE tienen permisos de CAS diferentes. Para obtener más información, vea Seguridad de acceso del código de integración CLR.

Comprobaciones de CREATE ASSEMBLY

Cuando se ejecuta la instrucción CREATE ASSEMBLY las comprobaciones siguientes se realizan para cada nivel de seguridad. Si se produce un error en cualquier comprobación, se producirá un error en CREATE ASSEMBLY con un mensaje de error.

Global (cualquier nivel de seguridad)

Todos los ensamblados a los que se hace referencia deben cumplir uno o más de los criterios siguientes:

  • El ensamblado ya está registrado en la base de datos.

  • El ensamblado es uno de los ensamblados compatibles. Para obtener más información, vea Bibliotecas de .NET Framework admitidas.

  • Está usando CREATE ASSEMBLY FROM<location>, y todos los ensamblados a los que hace referencia y sus dependencias están disponibles en <location>.

  • Está usando CREATE ASSEMBLY FROM<bytes …>, y todas las referencias se especifican a través de bytes separados por espacios.

EXTERNAL_ACCESS

Todos los ensamblados EXTERNAL_ACCESS deben cumplir los criterios siguientes:

  • Los campos estáticos no se usan para almacenar información. Se permiten los campos estáticos de sólo lectura.

  • Se pasa la prueba PEVerify. La herramienta PEVerify (peverify.exe), que comprueba que el código MSIL y los metadatos asociados cumplen los requisitos de seguridad de tipos, se proporciona con .NET Framework SDK.

  • La sincronización, por ejemplo no se usa con la clase SynchronizationAttribute.

  • No se usan métodos de finalizador.

Los atributos personalizados siguientes no se permiten en ensamblados 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

  • Se comprueban todas las condiciones del ensamblado EXTERNAL_ACCESS.

Comprobaciones en tiempo de ejecución

En tiempo de ejecución, el ensamblado de código se comprueba para las condiciones siguientes. Si se encuentra cualquiera de estas condiciones, el código administrado no se puede ejecutar y se iniciará una excepción.

UNSAFE

Cargar un ensamblado, explícitamente llamando al método System.Reflection.Assembly.Load() desde una matriz de bytes o implícitamente a través del uso del espacio de nombres Reflection.Emit, no se permite.

EXTERNAL_ACCESS

Se comprueban todas las condiciones UNSAFE.

Todos los tipos y métodos anotados con los siguientes valores de atributo de protección de host (HPA) en la lista compatible de ensamblados no están admitidos.

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

Para obtener más información acerca de los HPA y una lista de los tipos y miembros no admitidos en los ensamblados compatibles, vea Atributos de protección del host y programación de la integración CLR.

SAFE

Se comprueban todas las condiciones EXTERNAL_ACCESS.