Freigeben über


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änkt die Sichtbarkeitsprüfungen des JIT-Compilers überspringen, wenn ihr mit dem Flag ReflectionPermission die Berechtigung ReflectionPermissionFlag.RestrictedMemberAccess erteilt wurde. Die Vertrauensstufe der Assembly, auf deren nicht-öffentliche Mitglieder die dynamische Methode zugreift, muss gleich oder eine Untermenge der Vertrauensstufe des Call-Stacks sein, von dem die dynamische Methode ausgeht. 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) Mitglieder der Typen zugreifen. Sie können eine dynamische Methode mit jedem Modul verknüpfen, unabhängig davon, ob Sie das Modul erstellt haben, vorausgesetzt, eine Anforderung für ReflectionPermission mit dem RestrictedMemberAccess-Flag kann vom Aufrufstapel erfüllt werden, der Ihren Code enthält. 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 mit jedem Typ verknüpfen, aber Ihr Code muss ReflectionPermission mit den beiden Flags RestrictedMemberAccess und MemberAccess versehen sein.

Die folgende Tabelle zeigt, auf welche Typen und Mitglieder eine anonym gehostete dynamische Methode mit und ohne JIT-Sichtbarkeitsprüfungen zugreifen kann, je nachdem, ob ReflectionPermission mit dem Flag RestrictedMemberAccess gewährt wird.

Sichtbarkeitsprüfungen Ohne RestrictedMemberAccess Mit RestrictedMemberAccess
Ohne Überspringen von JIT-Sichtbarkeitsprüfungen Öffentliche Mitglieder von öffentlichen Typen in jeder Assembly. Öffentliche Mitglieder von öffentlichen Typen in jeder Assembly.
Überspringen von JIT-Sichtbarkeitsprüfungen, mit Einschränkungen Öffentliche Mitglieder von öffentlichen Typen in jeder Assembly. Alle Mitglieder aller Typen, nur in Assemblies, deren Vertrauenslevel gleich oder geringer ist als der Vertrauenslevel der Assembly, die die dynamische Methode emittiert 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 zu Modul Zugeordnet zu Typ
Nein Öffentliche und interne Mitglieder von öffentlichen, internen und privaten Typen im Modul.

Öffentliche Mitglieder von öffentlichen Typen in jeder Assembly.
Alle Mitglieder des zugehörigen Typs. Öffentliche und interne Mitglieder aller anderen Typen des Moduls.

Öffentliche Mitglieder von öffentlichen Typen in jeder Assembly.
Ja Alle Mitglieder aller Typen in einer Assembly. Alle Mitglieder aller Typen in einer 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 dynamische Methoden static Methoden (Shared Methoden in Visual Basic) sind, erlauben die entspannten Regeln für die Delegatenbindung, dass eine dynamische Methode an ein Objekt gebunden wird, sodass sie wie eine Instanzmethode funktioniert, wenn sie über diese Delegateninstanz aufgerufen wird. Ein Beispiel, das dies veranschaulicht, ist die Überladung der Methode CreateDelegate(Type, Object).

Verifizierung

In der folgenden Liste sind die Bedingungen zusammengefasst, unter denen dynamische Methoden nicht ifizierbaren Code enthalten können. (Zum Beispiel ist eine dynamische Methode nicht verifizierbar, wenn ihre InitLocals-Eigenschaft auf false festgelegt ist.)

  • 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. Siehe Security-Transparent Code, Ebene 1.
  • Wenn eine dynamische Methode, die unverifizierbaren Code enthält, einer Assembly mit Transparenz der Ebene 2 (z. B. mscorlib.dll) zugeordnet ist, löst sie eine Ausnahme (vom JIT-Compiler eingefügt) aus, anstatt eine Sicherheitsaufforderung vorzunehmen. Siehe Security-Transparent 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 mit Hilfe eines Delegaten aufrufen, der von der CreateDelegate Methode ausgelöst wurde, wird ein VerificationException ausgelöst. Wenn Sie die dynamische Methode über die Methode Invoke aufrufen, wird ein TargetInvocationException mit einem inneren VerificationException ausgelöst.