Klasse System.Reflection.Emit.DynamicMethod
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 de zichtbaarheidscontroles van de JIT-compiler beperken 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 van, het vertrouwensniveau van de aanroepstack die de dynamische methode heeft verzonden. 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.Notitie
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 persoonlijke 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 worden verleend ReflectionPermission met zowel de als MemberAccess de RestrictedMemberAccess 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 elke assembly. | Openbare leden van openbare typen in elke assembly. |
JIT-zichtbaarheidscontroles overslaan, met beperkingen | Openbare leden van openbare typen in elke assembly. | 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 elke assembly. |
Alle leden van het gekoppelde type. Openbare en interne leden van alle andere typen in de module. Openbare leden van openbare typen in elke assembly. |
Ja | Alle leden van alle typen in elke assembly. | Alle leden van alle typen in elke assembly. |
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 methoden (Shared
methoden in Visual Basic) zijnstatic
, kunnen met de soepele regels voor gedelegeerde binding een dynamische methode worden gebonden aan een object, zodat deze fungeert als een instantiemethode wanneer deze wordt aangeroepen met behulp van dat gemachtigde exemplaar. 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 bijvoorbeeld behandeld als beveiligingskritiek door de runtime. 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 Beveiligingstransparante 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), genereert deze een uitzondering (geïnjecteerd door de JIT-compiler) in plaats van een beveiligingsvraag te maken. Zie Beveiligingstransparante 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.