Einschränkungen des CLR-Integrationsprogrammiermodells
Gilt für: SQL Server Azure SQL verwaltete Instanz
Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, führt SQL Server bestimmte Codeprüfungen aus, die berücksichtigt werden müssen. Diese Prüfungen werden bei der ersten Registrierung in der Datenbank, mithilfe der CREATE ASSEMBLY
Anweisung und auch zur Laufzeit für die Assembly mit verwaltetem Code ausgeführt. Der verwaltete Code wird auch zur Laufzeit überprüft, da in einer Assembly möglicherweise Codepfade vorhanden sind, die möglicherweise nie zur Laufzeit erreicht werden.
Diese Codeüberprüfungen bieten Flexibilität beim Registrieren von Assemblys von Drittanbietern insbesondere, sodass eine Assembly nicht blockiert wird, wenn unsicherer Code für die Ausführung in einer Clientumgebung vorgesehen ist, aber niemals in der gehosteten Common Language Runtime (CLR) ausgeführt wird. Die Anforderungen, die der verwaltete Code erfüllen muss, hängen davon ab, ob die Assembly als SAFE
, oder EXTERNAL_ACCESS
UNSAFE
. SAFE
ist die strengste Sicherheitsstufe.
Neben den Einschränkungen, die für verwaltete Codeassemblys gelten, werden außerdem Sicherheitsberechtigungen für Code erteilt. Die CLR unterstützt das Sicherheitsmodell der Codezugriffssicherheit (Code Access Security, CAS) für verwalteten Code. In diesem Modell werden Assemblys Berechtigungen auf Grundlage der Identität des Codes gewährt. SAFE
-, EXTERNAL_ACCESS
- und UNSAFE
-Assemblys verfügen über andere CAS-Berechtigungen (Code Access Security). Weitere Informationen finden Sie unter CLR Integration Code Access Security.
Wenn die Herausgeberrichtlinie festgelegt ist, CREATE ASSEMBLY
schlägt ein Fehler fehl.
ERSTELLEN VON ASSEMBLYprüfungen
Wenn die CREATE ASSEMBLY
Anweisung ausgeführt wird, werden die folgenden Prüfungen für jede Sicherheitsstufe ausgeführt. Wenn eine Überprüfung fehlschlägt, CREATE ASSEMBLY
schlägt die Fehlermeldung fehl.
Global (eine beliebige Sicherheitsebene)
Alle Assemblys, auf die verwiesen wird, müssen ein oder mehrere der folgenden Kriterien erfüllen:
Die Assembly ist bereits in der Datenbank registriert.
Die Assembly ist eine der unterstützten Assemblys. Weitere Informationen finden Sie unter Unterstützte .NET Framework-Bibliotheken.
Sie verwenden
CREATE ASSEMBLY FROM <location>
, und alle referenzierten Assemblys und deren Abhängigkeiten sind verfügbar in<location>
.Sie verwenden
CREATE ASSEMBLY FROM <bytes ...>
, und alle Verweise werden über leerzeichentrennte Bytes angegeben.
EXTERNAL_ACCESS
Alle EXTERNAL_ACCESS
-Assemblys müssen die folgenden Kriterien erfüllen:
Statische Felder werden nicht zum Speichern von Informationen verwendet. Schreibgeschützte statische Felder sind zulässig.
Der PEVerify-Test wird bestanden. Das PEVerify-Tool (
peverify.exe
), mit dem überprüft wird, ob der Code für die allgemeine Zwischensprache (CIL) und die zugehörigen Metadaten den Typsicherheitsanforderungen entsprechen, wird mit dem .NET Framework SDK bereitgestellt.Die Synchronisierung, z. B. mit der
SynchronizationAttribute
Klasse, wird nicht verwendet.Finalizermethoden werden nicht verwendet.
Die folgenden benutzerdefinierten Attribute sind in EXTERNAL_ACCESS
-Assemblys nicht zulässig:
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
- Alle
EXTERNAL_ACCESS
-Assemblybedingungen werden überprüft.
Laufzeitüberprüfungen
Zur Laufzeit wird die Codeassembly auf die folgenden Bedingungen überprüft. Wenn eine dieser Bedingungen gefunden wird, darf der verwaltete Code nicht ausgeführt werden, und eine Ausnahme wird ausgelöst.
UNSAFE
Sie können eine Assembly nicht explizit laden, indem Sie die System.Reflection.Assembly.Load()
Methode aus einem Bytearray aufrufen oder implizit den Namespace verwenden Reflection.Emit
.
EXTERNAL_ACCESS
Alle UNSAFE
-Bedingungen werden überprüft.
Alle Typen und Methoden, die mit den folgenden Hostschutzattributwerten in der unterstützten Assemblyliste als Anmerkungen versehen sind, sind nicht zulässig.
SelfAffectingProcessMgmt
SelfAffectingThreading
Synchronization
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
Weitere Informationen zu HPAs und einer Liste der unzulässigen Typen und Member in den unterstützten Assemblys finden Sie unter Host Protection Attributes and CLR Integration Programming.
SAFE
Alle EXTERNAL_ACCESS
-Bedingungen werden überprüft.