System.Reflection.Emit.DynamicMethod-klasse

Opmerking

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

U kunt de DynamicMethod klasse gebruiken om tijdens runtime een methode te genereren en uit te voeren, zonder dat u een dynamische assembly en een dynamisch type hoeft te genereren om de methode te bevatten. De uitvoerbare code die is gemaakt door de Just-In-Time-compiler (JIT) wordt vrijgemaakt wanneer het DynamicMethod object wordt vrijgemaakt. Dynamische methoden zijn de meest efficiënte manier om kleine hoeveelheden code te genereren en uit te voeren.

Een dynamische methode kan anoniem worden gehost of kan logisch worden gekoppeld aan een module of met een type.

  • Als de dynamische methode anoniem wordt gehost, bevindt deze zich in een door het systeem geleverde assembly en is deze daarom geïsoleerd van andere code. Standaard heeft het geen toegang tot niet-openbare gegevens. Een anoniem gehoste dynamische methode kan een beperkte mogelijkheid hebben om de zichtbaarheidscontroles van de JIT-compiler over te slaan, als deze is verleend ReflectionPermission met de ReflectionPermissionFlag.RestrictedMemberAccess vlag. Het vertrouwensniveau van de assembly waarvan niet-openbare leden worden geopend door de dynamische methode, moet gelijk zijn aan, of een subset zijn van, het vertrouwensniveau van de aanroepstack die de dynamische methode heeft gegenereerd. Zie Walkthrough: Code verzenden in gedeeltelijke vertrouwensscenario's voor meer informatie over anoniem gehoste dynamische methoden.

  • Als de dynamische methode is gekoppeld aan een module die u opgeeft, is de dynamische methode effectief globaal voor die module. Het heeft toegang tot alle typen in de module en alle internal (Friend in Visual Basic) leden van de typen. U kunt een dynamische methode koppelen aan elke module, ongeacht of u de module hebt gemaakt, mits aan een vraag ReflectionPermission naar de RestrictedMemberAccess vlag kan worden voldaan door de aanroepstack die uw code bevat. Als de ReflectionPermissionFlag.MemberAccess vlag is opgenomen in de toekenning, kan de dynamische methode de zichtbaarheidscontroles van de JIT-compiler overslaan en toegang krijgen tot de persoonlijke gegevens van alle typen die zijn gedeclareerd in de module of in een andere module in een assembly.

    Opmerking

    Wanneer u de module opgeeft waaraan een dynamische methode is gekoppeld, mag die module zich niet in de door het systeem geleverde assembly bevinden die wordt gebruikt voor anonieme hosting.

  • Als de dynamische methode is gekoppeld aan een type dat u opgeeft, heeft deze toegang tot alle leden van het type, ongeacht het toegangsniveau. Daarnaast kunnen JIT-zichtbaarheidscontroles worden overgeslagen. Dit geeft de dynamische methode toegang tot de privégegevens van andere typen die zijn gedeclareerd in dezelfde module of in een andere module in een assembly. U kunt een dynamische methode koppelen aan elk type, maar uw code moet ReflectionPermission worden verleend met zowel de RestrictedMemberAccess als MemberAccess vlaggen.

In de volgende tabel ziet u welke typen en leden toegankelijk zijn voor een anoniem gehoste dynamische methode, met en zonder JIT-zichtbaarheidscontroles, afhankelijk van of ReflectionPermission aan de RestrictedMemberAccess vlag wordt verleend.

Zichtbaarheidscontroles Zonder RestrictedMemberAccess Met RestrictedMemberAccess
Zonder JIT-zichtbaarheidscontroles over te slaan Openbare leden van openbare typen in iedere assemblee. Openbare leden van openbare typen in iedere assemblee.
JIT-zichtbaarheidscontroles overslaan, met beperkingen Openbare leden van openbare typen in iedere assemblee. Alle leden van alle typen, alleen in assembly's waarvan de vertrouwensniveaus gelijk zijn aan of kleiner zijn dan het vertrouwensniveau van de assembly die de dynamische methode heeft verzonden.

In de volgende tabel ziet u welke typen en leden toegankelijk zijn voor een dynamische methode die is gekoppeld aan een module of met een type in een module.

JIT-zichtbaarheidscontroles overslaan Gekoppeld aan module Gekoppeld aan type
Nee. Openbare en interne leden van openbare, interne en privétypen in de module.

Openbare leden van openbare typen in iedere assemblee.
Alle leden van het gekoppelde type. Openbare en interne leden van alle andere typen in de module.

Openbare leden van openbare typen in iedere assemblee.
Ja Alle leden van alle typen in welke samenstelling dan ook. Alle leden van alle typen in welke samenstelling dan ook.

Een dynamische methode die aan een module is gekoppeld, heeft de machtigingen van die module. Een dynamische methode die aan een type is gekoppeld, heeft de machtigingen van de module die dat type bevat.

Dynamische methoden en hun parameters hoeven niet benoemd te worden, maar u kunt namen opgeven om te helpen bij het opsporen van fouten. Aangepaste kenmerken worden niet ondersteund voor dynamische methoden of hun parameters.

Hoewel dynamische methoden staticmethoden (Sharedmethoden in Visual Basic) zijn, kunnen met de soepele regels voor gedelegeerde binding een dynamische methode aan een object worden gebonden, zodat deze fungeert als een instantiemethode wanneer deze wordt aangeroepen met behulp van die gedelegeerde instantie. Een voorbeeld dat dit laat zien, is beschikbaar voor de overbelasting van de CreateDelegate(Type, Object) methode.

Verificatie

De volgende lijst bevat een overzicht van de voorwaarden waaronder dynamische methoden niet-verifieerbare code kunnen bevatten. (Een dynamische methode kan bijvoorbeeld niet worden geverifieerd als de InitLocals eigenschap is ingesteld op false.)

  • Een dynamische methode die is gekoppeld aan een beveiligingskritieke assembly is ook beveiligingskritiek en kan verificatie overslaan. Een assembly zonder beveiligingskenmerken die als een bureaubladtoepassing wordt uitgevoerd, wordt door de runtime als beveiligingskritiek beschouwd. Als u een dynamische methode aan de assembly koppelt, kan de dynamische methode niet-verifieerbare code bevatten.
  • Als een dynamische methode die niet-verifieerbare code bevat, is gekoppeld aan een assembly met transparantie op niveau 1, injecteert de Just-In-Time-compiler een beveiligingsvraag. De vraag slaagt alleen als de dynamische methode wordt uitgevoerd door volledig vertrouwde code. Zie Security-Transparent Code, Niveau 1.
  • Als een dynamische methode die niet-verifieerbare code bevat, is gekoppeld aan een assembly met transparantie op niveau 2 (zoals mscorlib.dll), wordt er een uitzondering gegenereerd (geïnjecteerd door de JIT-compiler) in plaats van een beveiligingsvraag te maken. Zie Security-Transparent Code, Niveau 2.
  • Een anoniem gehoste dynamische methode die niet-verifieerbare code bevat, genereert altijd een uitzondering. De verificatie kan nooit worden overgeslagen, zelfs als deze wordt gemaakt en uitgevoerd door volledig vertrouwde code.

De uitzondering die wordt gegenereerd voor niet-verifieerbare code, is afhankelijk van de manier waarop de dynamische methode wordt aangeroepen. Als u een dynamische methode aanroept met behulp van een gemachtigde die is geretourneerd uit de CreateDelegate methode, wordt er een VerificationException gegenereerd. Als u de dynamische methode aanroept met behulp van de Invoke methode, wordt er een TargetInvocationException gegenereerd met een binnenste VerificationException.