System.Reflection.Emit.DynamicMethod-Klasse
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Sie können die DynamicMethod Klasse verwenden, um eine Methode zur Laufzeit zu generieren und auszuführen, ohne eine dynamische Assembly und einen dynamischen Typ generieren zu müssen, der die Methode enthalten soll. Der vom JIT-Compiler (Just-in-Time) erstellte ausführbare Code wird erneut beansprucht, wenn das DynamicMethod Objekt erneut beansprucht wird. Dynamische Methoden sind die effizienteste Methode zum Generieren und Ausführen kleiner Codemengen.
Eine dynamische Methode kann anonym gehostet werden, oder sie kann logisch einem Modul oder einem Typ zugeordnet werden.
Wenn die dynamische Methode anonym gehostet wird, befindet sie sich in einer vom System bereitgestellten Assembly und ist daher von einem anderen Code isoliert. Standardmäßig hat sie keinen Zugriff auf nicht öffentliche Daten. Eine anonym gehostete dynamische Methode kann eingeschränkte Möglichkeit haben, die Sichtbarkeitsprüfungen des JIT-Compilers zu überspringen, wenn sie mit der ReflectionPermissionFlag.RestrictedMemberAccess Kennzeichnung erteilt ReflectionPermission wurde. Die Vertrauensstufe der Assembly, auf die nicht öffentliche Member durch die dynamische Methode zugegriffen wird, muss gleich der Vertrauensstufe des Aufrufstapels sein, der die dynamische Methode ausgegeben hat. Weitere Informationen zu anonym gehosteten dynamischen Methoden finden Sie unter Walkthrough: Emitting Code in Partial Trust Scenarios.
Wenn die dynamische Methode einem von Ihnen angegebenen Modul zugeordnet ist, ist die dynamische Methode effektiv global für dieses Modul. Er kann auf alle Typen im Modul und alle
internal
(Friend
in Visual Basic) Member der Typen zugreifen. Sie können einer dynamischen Methode jedes Moduls zuordnen, unabhängig davon, ob Sie das Modul erstellt haben, vorausgesetzt, eine Anforderung für ReflectionPermission das RestrictedMemberAccess Flag kann durch den Aufrufstapel, der Ihren Code enthält, erfüllt werden. Wenn das ReflectionPermissionFlag.MemberAccess Flag in der Erteilung enthalten ist, kann die dynamische Methode die Sichtbarkeitsprüfungen des JIT-Compilers überspringen und auf die privaten Daten aller Typen zugreifen, die im Modul oder in einem anderen Modul in einer beliebigen Assembly deklariert sind.Hinweis
Wenn Sie das Modul angeben, dem eine dynamische Methode zugeordnet ist, darf sich dieses Modul nicht in der vom System bereitgestellten Assembly befinden, die für anonymes Hosting verwendet wird.
Wenn die dynamische Methode einem von Ihnen angegebenen Typ zugeordnet ist, hat sie unabhängig von der Zugriffsebene Zugriff auf alle Member des Typs. Darüber hinaus können JIT-Sichtbarkeitsprüfungen übersprungen werden. Dadurch erhält die dynamische Methode Zugriff auf die privaten Daten anderer Typen, die im selben Modul oder in einem anderen Modul in jeder Assembly deklariert sind. Sie können eine dynamische Methode einem beliebigen Typ zuordnen, aber Ihr Code muss sowohl mit den RestrictedMemberAccess Kennzeichen als MemberAccess auch mit den Flags erteilt ReflectionPermission werden.
In der folgenden Tabelle wird gezeigt, auf welche Typen und Member für eine anonym gehostete dynamische Methode mit und ohne JIT-Sichtbarkeitsprüfungen zugegriffen werden kann, je nachdem, ob ReflectionPermission das RestrictedMemberAccess Flag erteilt wird.
Sichtbarkeitsprüfungen | Ohne RestrictedMemberAccess |
Mit RestrictedMemberAccess |
---|---|---|
Ohne JIT-Sichtbarkeitsprüfungen zu überspringen | Öffentliche Member öffentlicher Typen in jeder Assembly. | Öffentliche Member öffentlicher Typen in jeder Assembly. |
Überspringen von JIT-Sichtbarkeitsprüfungen mit Einschränkungen | Öffentliche Member öffentlicher Typen in jeder Assembly. | Alle Member aller Typen, nur in Assemblys, deren Vertrauensstufen gleich oder kleiner als die Vertrauensstufe der Assembly sind, die die dynamische Methode ausgegeben hat. |
Die folgende Tabelle zeigt, auf welche Typen und Member für eine dynamische Methode zugegriffen werden kann, die einem Modul oder einem Typ in einem Modul zugeordnet ist.
JIT-Sichtbarkeitsprüfungen überspringen | Zugeordnet mit Modul | Zugeordnet mit Typ |
---|---|---|
Nein | Öffentliche und interne Member öffentlicher, interner und privater Typen im Modul. Öffentliche Member öffentlicher Typen in jeder Assembly. |
Alle Elemente des zugeordneten Typs. Öffentliche und interne Member aller anderen Typen im Modul. Öffentliche Member öffentlicher Typen in jeder Assembly. |
Ja | Alle Elemente aller Typen in jeder Assembly. | Alle Elemente aller Typen in jeder Assembly. |
Eine dynamische Methode, die einem Modul zugeordnet ist, verfügt über die Berechtigungen dieses Moduls. Eine dynamische Methode, die einem Typ zugeordnet ist, verfügt über die Berechtigungen des Moduls, das diesen Typ enthält.
Dynamische Methoden und ihre Parameter müssen nicht benannt werden, aber Sie können Namen angeben, die beim Debuggen unterstützt werden sollen. Benutzerdefinierte Attribute werden für dynamische Methoden oder deren Parameter nicht unterstützt.
Obwohl es sich bei dynamischen Methoden static
um Methoden (Shared
Methoden in Visual Basic) handelt, können die entspannten Regeln für die Stellvertretungsbindung eine dynamische Methode an ein Objekt gebunden werden, sodass sie wie eine Instanzmethode fungiert, wenn sie mithilfe dieser Delegateninstanz aufgerufen wird. Ein Beispiel, das dies veranschaulicht, wird für die CreateDelegate(Type, Object) Methodenüberladung bereitgestellt.
Überprüfung
In der folgenden Liste sind die Bedingungen zusammengefasst, unter denen dynamische Methoden nicht ifizierbaren Code enthalten können. (Eine dynamische Methode ist beispielsweise unverifizierbar, wenn die InitLocals Eigenschaft auf false
.)
- Eine dynamische Methode, die einer sicherheitskritischen Assembly zugeordnet ist, ist ebenfalls sicherheitskritisch und kann die Überprüfung überspringen. Beispielsweise wird eine Assembly ohne Sicherheitsattribute, die als Desktopanwendung ausgeführt werden, von der Laufzeit als sicherheitskritisch behandelt. Wenn Sie der Assembly eine dynamische Methode zuordnen, kann die dynamische Methode unverifizierbaren Code enthalten.
- Wenn eine dynamische Methode, die unverifizierbaren Code enthält, einer Assembly zugeordnet ist, die Transparenz der Ebene 1 aufweist, fügt der JIT-Compiler eine Sicherheitsnachfrage ein. Die Anforderung ist nur erfolgreich, wenn die dynamische Methode mit voll vertrauenswürdigen Code ausgeführt wird. Sicherheitstransparenter Code, Ebene 1.
- Wenn eine dynamische Methode, die unverifizierbaren Code enthält, einer Assembly zugeordnet ist, die Transparenz der Ebene 2 aufweist (z. B. mscorlib.dll), löst sie eine Ausnahme (vom JIT-Compiler eingefügt) aus, anstatt eine Sicherheitsnachfrage zu erstellen. Sicherheitstransparenter Code, Ebene 2.
- Eine anonym gehostete dynamische Methode, die unverifizierbarem Code enthält, löst immer eine Ausnahme aus. Sie kann die Überprüfung niemals überspringen, auch wenn sie durch vollständig vertrauenswürdigen Code erstellt und ausgeführt wird.
Die Ausnahme, die für nichtifizierbaren Code ausgelöst wird, variiert je nach Aufruf der dynamischen Methode. Wenn Sie eine dynamische Methode mithilfe eines von der CreateDelegate Methode zurückgegebenen Delegaten aufrufen, wird ein VerificationException Fehler ausgelöst. Wenn Sie die dynamische Methode mithilfe der Invoke Methode aufrufen, wird eine TargetInvocationException mit einer inneren VerificationExceptionausgelöst.