Freigeben über


Einschränkungen des CLR-Integrationsprogrammierungsmodells

Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, werden bestimmte Codeüberprüfungen von SQL Server ausgeführt, wenn sie zum ersten Mal in der Datenbank CREATE ASSEMBLY registriert und zur Laufzeit verwendet werden. Der verwaltete Code wird auch zur Laufzeit überprüft, da in einer Assembly Möglicherweise Codepfade vorhanden sind, die zur Laufzeit nie erreicht werden. Dies bietet Flexibilität beim Registrieren von Assemblys von Drittanbietern, insbesondere, damit eine Assembly nicht blockiert wird, wenn es "unsicheren" Code gibt, der in einer Clientumgebung ausgeführt werden soll, aber 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_ACCESSoder UNSAFE, SAFE als strengste registriert ist und unten aufgeführt sind.

Neben den Einschränkungen, die für verwaltete Codeassemblys gelten, werden außerdem Sicherheitsberechtigungen für Code erteilt. Die Common Language Runtime (CLR) unterstützt ein Sicherheitsmodell, das als Codezugriffssicherheit (Code Access Security, CAS) 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 Code Access Security.

CREATE ASSEMBLY-Prü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<Speicherort>, und alle referenzierten Assemblys und deren Abhängigkeiten sind an< der Position> verfügbar.

  • 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.

  • PEVerify-Test wird bestanden. Das PEVerify-Tool (peverify.exe), das überprüft, ob der MSIL-Code 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

SICHER

  • 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.

UNSICHER

Das Explizite Laden einer Assembly durch Aufrufen der System.Reflection.Assembly.Load() Methode aus einem Bytearray oder implizit durch die Verwendung von Reflection.Emit Namespaces 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

  • Synchronisierung

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • Benutzeroberfläche

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.

SICHER

Alle EXTERNAL_ACCESS-Bedingungen werden überprüft.

Siehe auch

Unterstützte .NET Framework-Bibliotheken
CLR-Integrationscodezugriffssicherheit
Hostschutzattribute und CLR-Integrationsprogrammierung
Erstellen einer Assembly