Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Pomocí třídy můžete DynamicMethod vygenerovat a spustit metodu za běhu, aniž byste museli generovat dynamické sestavení a dynamický typ obsahující 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 jí byl udělen ReflectionPermission s 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ů (Friendv 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ředpokladuReflectionPermission, že požadavek na RestrictedMemberAccess 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 vašemu kódu musí být uděleny příznaky ReflectionPermission a RestrictedMemberAccess.
Následující tabulka ukazuje, které typy a členy jsou přístupné pro anonymně hostované dynamické metody, s kontrolami viditelnosti JIT a bez nich, v závislosti na tom, zda ReflectionPermission s příznakem RestrictedMemberAccess byl udělen.
| Kontroly viditelnosti | Bez RestrictedMemberAccess |
S RestrictedMemberAccess |
|---|---|---|
| Bez přeskočení kontrol viditelnosti JIT | Veřejní členové veřejných typů v libovolném sestavení. | Veřejní členové veřejných typů v libovolném sestavení. |
| Přeskakování kontrol viditelnosti JIT s určitými omezeními | Veřejní členové 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čte kontroly viditelnosti JIT | Přidruženo k modulu | Přidruženo k typu |
|---|---|---|
| Ne | Veřejní a interní členové veřejných, interních a soukromých typů v modulu. Veřejní členové 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í členové 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ý to demonstruje, je poskytnut pro přetížení metody CreateDelegate(Type, Object).
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 spojená se sestavením důležitým pro zabezpečení je také důležitá pro zabezpečení a může se vyhnout ověření. Například sestavení bez atributů zabezpečení, které se spouští jako desktopová aplikace, je runtime považováno za kritické vůči 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 Security-Transparent Kód, úroveň 1.
- Pokud je dynamická metoda, která obsahuje neověřitelný kód, přidružena k sestavení, které má průhlednost úrovně 2 (například mscorlib.dll), vyvolá výjimku (vloženou kompilátorem JIT) namísto vyžádání zabezpečení. Viz Security-Transparent kód, ú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 z CreateDelegate metody, je vyvolána VerificationException. Pokud vyvoláte dynamickou metodu pomocí Invoke metody, je vyvolána výjimka typu TargetInvocationException s vnitřní výjimkou VerificationException.