Freigeben über


Beschränkungen des Programmiermodells für die CLR-Integration

Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, sind einige Codeprüfungen zu beachten, die von SQL Server durchgeführt werden. SQL Server führt Überprüfungen der verwalteten Codeassembly mit der CREATE ASSEMBLY-Anweisung beim ersten Registrieren in der Datenbank und zur Laufzeit 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.