Beschränkungen des Programmiermodells für die CLR-Integration
Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, gibt es bestimmte Codeprüfungen, die von SQL Server ausgeführt werden und berücksichtigt werden müssen. SQL Server führt zur Laufzeit und bei der ersten Registrierung in der Datenbank mit der CREATE ASSEMBLY-Anweisung Überprüfungen der verwalteten Codeassembly durch. Der verwaltete Code wird außerdem zur Laufzeit überprüft, da in einer Assembly Codepfade vorhanden sein können, die zur Laufzeit eigentlich nicht erreicht werden. Dadurch wird Flexibilität für die Registrierung von Assemblys von Drittanbietern geschaffen, sodass eine Assembly nicht blockiert wird, wenn ein "Unsafe"-Code vorliegt, der in einer Clientumgebung ausgeführt werden soll, jedoch nie in der gehosteten CLR ausgeführt wird. Die Anforderungen, die der verwaltete Code erfüllen muss, hängen davon ab, ob die Assembly als SAFE, EXTERNAL_ACCESS oder UNSAFE registriert wird. SAFE ist die strengste Anforderung. Die Anforderungen werden im Folgenden aufgeführt.
Neben den Einschränkungen, die für verwaltete Codeassemblys gelten, werden außerdem Sicherheitsberechtigungen für Code erteilt. Die CLR (Common Language Runtime) unterstützt ein Sicherheitsmodell, das als Codezugriffssicherheit für verwalteten Code bezeichnet wird. 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 und Codezugriffssicherheit.
CREATE ASSEMBLY-Überprüfungen
Wenn die CREATE ASSEMBLY-Anweisung ausgeführt wird, werden die folgenden Überprüfungen für jede Sicherheitsebene vorgenommen. Schlägt eine Überprüfung fehl, wird CREATE ASSEMBLY mit einer Fehlermeldung abgebrochen.
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 Assemblys, auf die verwiesen wird, und ihre Abhängigkeiten sind in <location> verfügbar.
Sie verwenden CREATE ASSEMBLY FROM<bytes …>,, und alle Verweise werden mit durch Leerzeichen getrennte Bytes angegeben.
EXTERNAL_ACCESS
Alle EXTERNAL_ACCESS-Assemblys müssen die folgenden Kriterien erfüllen:
Statische Felder werden nicht verwendet, um Informationen zu speichern. Schreibgeschützte statische Felder sind zulässig.
Der PEVerify-Test wird bestanden. Das PEVerify-Tool (peverify.exe), das überprüft, ob der MSIL-Code und die zugeordneten Metadaten den Anforderungen an die Typsicherheit entsprechen, wird mit .NET Framework SDK zur Verfügung gestellt.
Die Synchronisierung, z. B. mit der SynchronizationAttribute-Klasse, wird nicht verwendet.
Finalizer-Methoden 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. Wird eine dieser Bedingungen erkannt, darf der verwaltete Code nicht ausgeführt werden und es wird eine Ausnahme ausgelöst.
UNSAFE
Das Laden einer Assembly, entweder explizit durch Aufrufen der System.Reflection.Assembly.Load()-Methode von einem Bytearray aus oder implizit durch Verwendung des Reflection.Emit-Namespace, ist nicht zulässig.
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 über Hostschutzattribute und eine Liste der unzulässigen Typen und Elemente der unterstützten Assemblys finden Sie unter Hostschutzattribute und Programmierung der CLR-Integration.
SAFE
Alle EXTERNAL_ACCESS-Bedingungen werden überprüft.
Siehe auch
Konzepte
Unterstützte .NET Framework-Bibliotheken
CLR-Integration und Codezugriffssicherheit