Megosztás a következőn keresztül:


Rendszer. Önkifejezés ion. Emit.DynamicMethod osztály

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

Az DynamicMethod osztály használatával futtatáskor hozhat létre és hajthat végre metódusokat anélkül, hogy dinamikus szerelvényt és dinamikus típust kellene létrehoznia a metódus létrehozásához. A just-in-time (JIT) fordító által létrehozott végrehajtható kód az objektum visszaigénylésekor DynamicMethod lesz visszakövetelve. A dinamikus metódusok a leghatékonyabban kis mennyiségű kód létrehozására és végrehajtására szolgálnak.

A dinamikus metódusok névtelenül üzemeltethetők, vagy logikailag hozzárendelhetők egy modulhoz vagy egy típushoz.

  • Ha a dinamikus metódus névtelenül van üzemeltetve, egy rendszer által biztosított szerelvényben található, ezért el van különítve más kódtól. Alapértelmezés szerint nem rendelkezik hozzáféréssel a nem nyilvános adatokhoz. A névtelenül üzemeltetett dinamikus metódusok korlátozottan hagyhatják ki a JIT-fordító láthatósági ellenőrzését, ha a ReflectionPermissionFlag.RestrictedMemberAccess jelölővel rendelkezikReflectionPermission. Annak a szerelvénynek a megbízhatósági szintje, amelynek nem nyilvános tagjait a dinamikus metódus éri el, a dinamikus metódust kibocsátó hívásverem megbízhatósági szintjének vagy egy részhalmazának kell lennie. A névtelenül üzemeltetett dinamikus módszerekkel kapcsolatos további információkért lásd : Útmutató: Kódkibocsátó kód részleges megbízhatósági forgatókönyvekben.

  • Ha a dinamikus metódus egy ön által megadott modulhoz van társítva, a dinamikus módszer gyakorlatilag globális az adott modulra. A modulban minden típushoz hozzáférhet, és a típusok összes internal (Friend Visual Basic)-tagját is elérheti. A dinamikus metódusokat bármely modulhoz társíthatja, függetlenül attól, hogy létrehozta-e a modult, feltéve, hogy a RestrictedMemberAccess jelölőre vonatkozó ReflectionPermission igény kielégíthető a kódot tartalmazó hívásverem által. Ha a ReflectionPermissionFlag.MemberAccess jelölő szerepel a támogatásban, a dinamikus módszer kihagyhatja a JIT-fordító láthatósági ellenőrzését, és hozzáférhet a modulban vagy bármely szerelvény bármely más moduljában deklarált összes típus személyes adataihoz.

    Feljegyzés

    Ha megadja azt a modult, amelyhez dinamikus metódus van társítva, a modul nem lehet a névtelen üzemeltetéshez használt rendszer által biztosított szerelvényben.

  • Ha a dinamikus metódus egy ön által megadott típushoz van társítva, hozzáféréssel rendelkezik a típus összes tagjára, a hozzáférési szinttől függetlenül. Emellett a JIT láthatósági ellenőrzései kihagyhatók. Ez hozzáférést biztosít a dinamikus metódusnak az ugyanabban a modulban vagy bármely szerelvény bármely más moduljában deklarált más típusok személyes adataihoz. A dinamikus metódusokat bármilyen típushoz társíthatja, de a kódot meg kell adni ReflectionPermission mind a jelölőkkel, mind a RestrictedMemberAccessMemberAccess jelölőkkel.

Az alábbi táblázat azt mutatja be, hogy mely típusok és tagok érhetők el egy névtelenül üzemeltetett dinamikus módszerhez JIT láthatósági ellenőrzésekkel és anélkül, attól függően, hogy a RestrictedMemberAccess jelölő meg van-e ReflectionPermission adva.

Láthatósági ellenőrzések Nélkül RestrictedMemberAccess A RestrictedMemberAccess
JIT láthatósági ellenőrzések kihagyása nélkül Nyilvános típusú nyilvános tagok bármely szerelvényben. Nyilvános típusú nyilvános tagok bármely szerelvényben.
JIT láthatósági ellenőrzések kihagyása korlátozásokkal Nyilvános típusú nyilvános tagok bármely szerelvényben. Minden típus minden tagja, csak olyan szerelvényekben, amelyek megbízhatósági szintje egyenlő vagy kisebb, mint a dinamikus metódust kibocsátó szerelvény megbízhatósági szintje.

Az alábbi táblázat azt mutatja be, hogy mely típusok és tagok érhetők el egy modulhoz vagy egy modul típusához társított dinamikus metódushoz.

JIT láthatósági ellenőrzések kihagyása Modulhoz társítva Típushoz társítva
Nem A modul nyilvános, belső és privát típusainak nyilvános és belső tagjai.

Nyilvános típusú nyilvános tagok bármely szerelvényben.
A társított típus összes tagja. A modul többi típusának nyilvános és belső tagjai.

Nyilvános típusú nyilvános tagok bármely szerelvényben.
Igen A szerelvény minden típusának minden tagja. A szerelvény minden típusának minden tagja.

Egy modulhoz társított dinamikus metódus rendelkezik a modul engedélyeivel. Egy típushoz társított dinamikus metódus rendelkezik az adott típust tartalmazó modul engedélyeivel.

A dinamikus metódusokat és paramétereiket nem kell megnevezni, de megadhat neveket a hibakereséshez. Az egyéni attribútumok nem támogatottak a dinamikus metódusokban vagy azok paramétereiben.

Bár a dinamikus metódusok metódusok static (Shared a Visual Basic metódusai), a delegálási kötés laza szabályai lehetővé teszik, hogy a dinamikus metódusok objektumhoz legyenek kötve, így az adott delegált példány használatakor a példány metódusához hasonlóan működik. Egy példa, amely bemutatja, hogy ez a módszer túlterhelt CreateDelegate(Type, Object) .

Ellenőrzés

Az alábbi lista összefoglalja azokat a feltételeket, amelyek mellett a dinamikus metódusok ellenőrizhető kódot tartalmazhatnak. (Például egy dinamikus metódus nem ellenőrizhető, ha a tulajdonsága InitLocalsfalse.)

  • A biztonsági szempontból kritikus szerelvényhez társított dinamikus módszer szintén biztonsági szempontból kritikus fontosságú, és kihagyhatja az ellenőrzést. Az asztali alkalmazásként futtatott biztonsági attribútumokkal nem rendelkező szerelvényeket például a futtatókörnyezet biztonsági szempontból kritikus fontosságúnak tekinti. Ha dinamikus metódust társít a szerelvényhez, a dinamikus metódus ellenőrizhető kódot tartalmazhat.
  • Ha egy ellenőrizhetetlen kódot tartalmazó dinamikus metódus egy 1. szintű átlátszóságú szerelvényhez van társítva, a just-in-time (JIT) fordító biztonsági igényeket támaszt. Az igény csak akkor sikeres, ha a dinamikus metódust teljes mértékben megbízható kód hajtja végre. Lásd: Security-Transparent Code, Level 1.
  • Ha egy ellenőrizhetetlen kódot tartalmazó dinamikus metódus olyan szerelvényhez van társítva, amely 2. szintű átlátszóságú (például mscorlib.dll), akkor biztonsági igény helyett kivételt (a JIT-fordító injektál) ad vissza. Lásd: Security-Transparent Code, Level 2.
  • Egy névtelenül üzemeltetett dinamikus módszer, amely nem ellenőrizhető kódot tartalmaz, mindig kivételt eredményez. Soha nem hagyhatja ki az ellenőrzést, még akkor sem, ha teljesen megbízható kóddal hozza létre és hajtja végre.

A nem ellenőrizhető kód kivétele a dinamikus metódus meghívásának módjától függően változik. Ha egy dinamikus metódust a metódusból CreateDelegate visszaadott meghatalmazott használatával hív meg, VerificationException a rendszer a metódust küldi el. Ha a metódussal hívja meg a dinamikus metódust, TargetInvocationException a Invoke rendszer egy belsőt VerificationExceptionfog használni.