Sdílet prostřednictvím


Systému. Reflexe ion. Emit.DynamicMethod – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Třídu můžete použít DynamicMethod k vygenerování a spuštění metody za běhu, aniž byste museli generovat dynamické sestavení a dynamický typ, který bude obsahovat metodu. Spustitelný kód vytvořený kompilátorem JIT (just-in-time) se uvolní při uvolnění objektu DynamicMethod . Dynamické metody představují nejúčinnější způsob generování a spouštění malých objemů kódu.

Dynamická metoda může být anonymně hostovaná nebo může být logicky přidružená k modulu nebo typu.

  • Pokud je dynamická metoda anonymně hostovaná, nachází se v sestavení poskytovaném systémem, a proto je izolovaná od jiného kódu. Ve výchozím nastavení nemá přístup k žádným neveřejovým datům. Anonymně hostovaná dynamická metoda může mít omezenou schopnost přeskočit kontroly viditelnosti kompilátoru JIT, pokud byla udělena ReflectionPermission příznakem ReflectionPermissionFlag.RestrictedMemberAccess . Úroveň důvěryhodnosti sestavení, jejíž neveřejné členy jsou přístupné dynamickou metodou, musí být rovna nebo podmnožině úrovně důvěryhodnosti zásobníku volání, který vygeneroval dynamickou metodu. Další informace o anonymně hostovaných dynamických metodách naleznete v tématu Návod: Generování kódu ve scénářích částečné důvěryhodnosti.

  • Pokud je dynamická metoda přidružená k zadanému modulu, dynamická metoda je v podstatě globální pro tento modul. Má přístup ke všem typům v modulu a všem internal členům těchto typů (Friend v jazyce Visual Basic). Dynamickou metodu můžete přidružit k libovolnému modulu bez ohledu na to, jestli jste modul vytvořili, za předpokladuRestrictedMemberAccess, že požadavek na ReflectionPermission příznak může být splněn zásobníkem volání, který obsahuje váš kód. ReflectionPermissionFlag.MemberAccess Pokud je příznak součástí grantu, dynamická metoda může přeskočit kontroly viditelnosti kompilátoru JIT a získat přístup k soukromým datům všech typů deklarovaných v modulu nebo v jakémkoli jiném modulu v libovolném sestavení.

    Poznámka:

    Pokud zadáte modul, ke kterému je přidružena dynamická metoda, tento modul nesmí být v systémovém sestavení, které se používá pro anonymní hostování.

  • Pokud je dynamická metoda přidružená k zadanému typu, má přístup ke všem členům typu bez ohledu na úroveň přístupu. Kontroly viditelnosti JIT je navíc možné přeskočit. To dává dynamické metodě přístup k privátním datům jiných typů deklarovaných ve stejném modulu nebo v jakémkoli jiném modulu v libovolném sestavení. Dynamickou metodu můžete přidružit k libovolnému typu, ale kód musí být udělený ReflectionPermission jak s příznaky RestrictedMemberAccessMemberAccess , tak i s příznakem.

Následující tabulka ukazuje, které typy a členy jsou přístupné pro anonymně hostované dynamické metody, s kontrolami viditelnosti JIT a bez ohledu na to, jestli ReflectionPermissionRestrictedMemberAccess je příznak udělen.

Kontroly viditelnosti Bez RestrictedMemberAccess S RestrictedMemberAccess
Bez přeskočení kontrol viditelnosti JIT Veřejné členy veřejných typů v libovolném sestavení. Veřejné členy veřejných typů v libovolném sestavení.
Přeskočení kontrol viditelnosti JIT s omezeními Veřejné členy veřejných typů v libovolném sestavení. Všechny členy všech typů, pouze v sestaveních, jejichž úrovně důvěryhodnosti jsou rovny nebo menší než úroveň důvěryhodnosti sestavení, která vygenerovala dynamickou metodu.

Následující tabulka ukazuje, které typy a členy jsou přístupné pro dynamickou metodu přidruženou k modulu nebo typu v modulu.

Přeskočení kontrol viditelnosti JIT Přidruženo k modulu Přidruženo k typu
No Veřejné a interní členy veřejných, interních a soukromých typů v modulu.

Veřejné členy veřejných typů v libovolném sestavení.
Všichni členové přidruženého typu. Veřejné a interní členy všech ostatních typů v modulu.

Veřejné členy veřejných typů v libovolném sestavení.
Ano Všechny členy všech typů v libovolném sestavení. Všechny členy všech typů v libovolném sestavení.

Dynamická metoda přidružená k modulu má oprávnění tohoto modulu. Dynamická metoda přidružená k typu má oprávnění modulu obsahujícího tento typ.

Dynamické metody a jejich parametry nemusí být pojmenované, ale můžete zadat názvy, které vám pomůžou při ladění. Vlastní atributy nejsou podporovány u dynamických metod ani jejich parametrů.

I když dynamické metody jsou static metody (Shared metody v jazyce Visual Basic), uvolněná pravidla pro vazbu delegáta umožňují, aby dynamická metoda byla vázána na objekt, takže funguje jako metoda instance při zavolání pomocí této instance delegáta. Příklad, který ukazuje, že je k dispozici pro CreateDelegate(Type, Object) přetížení metody.

Ověření

Následující seznam shrnuje podmínky, za kterých dynamické metody mohou obsahovat neověřitelný kód. (Například dynamická metoda není možné ověřit, pokud je její InitLocals vlastnost nastavena na false.)

  • Dynamická metoda přidružená k sestavení kritické pro zabezpečení je také kritická pro zabezpečení a může přeskočit ověření. Například sestavení bez atributů zabezpečení, které se spouští jako desktopová aplikace, se modul runtime považuje za kritické zabezpečení. Pokud k sestavení přidružíte dynamickou metodu, může dynamická metoda obsahovat neověřitelný kód.
  • Pokud je dynamická metoda obsahující neověřitelný kód přidružena k sestavení, které má transparentnost úrovně 1, kompilátor JIT (just-in-time) vloží požadavek na zabezpečení. Požadavek je úspěšný pouze v případě, že dynamická metoda je spuštěna plně důvěryhodným kódem. Viz kód transparentní zabezpečení, úroveň 1.
  • Pokud je dynamická metoda obsahující neověřitelný kód přidružená k sestavení, které má průhlednost úrovně 2 (například mscorlib.dll), vyvolá výjimku (vloženou kompilátorem JIT) místo vyžádání zabezpečení. Viz kód transparentní zabezpečení, úroveň 2.
  • Anonymně hostovaná dynamická metoda, která obsahuje neověřitelný kód, vždy vyvolá výjimku. Nikdy nemůže přeskočit ověření, i když se vytvoří a spustí plně důvěryhodným kódem.

Výjimka vyvolaná pro neověřitelný kód se liší v závislosti na způsobu vyvolání dynamické metody. Pokud vyvoláte dynamickou metodu pomocí delegáta vráceného CreateDelegate z metody, VerificationException vyvolá se vyvolán. Pokud vyvoláte dynamickou metodu pomocí Invoke metody, TargetInvocationException vyvolá se VerificationExceptionvnitřní .