System. Emocje ion. Emit.DynamicMethod, klasa
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Za pomocą DynamicMethod klasy można wygenerować i wykonać metodę w czasie wykonywania bez konieczności generowania zestawu dynamicznego i typu dynamicznego, aby zawierać metodę. Kod wykonywalny utworzony przez kompilator just in time (JIT) jest odzyskiwane po odzyskaniu DynamicMethod obiektu. Metody dynamiczne to najbardziej wydajny sposób generowania i wykonywania małych ilości kodu.
Metoda dynamiczna może być hostowana anonimowo lub może być logicznie skojarzona z modułem lub typem.
Jeśli metoda dynamiczna jest hostowana anonimowo, znajduje się w zestawie dostarczonym przez system i dlatego jest odizolowana od innego kodu. Domyślnie nie ma dostępu do żadnych danych innych niż publiczne. Anonimowo hostowana metoda dynamiczna może mieć ograniczoną możliwość pomijania kontroli widoczności kompilatora JIT, jeśli została ona udzielona ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess . Poziom zaufania zestawu, do którego dostęp do elementów członkowskich innych niż publiczny jest uzyskiwany przez metodę dynamiczną, musi być równy lub podzestawowi poziomu zaufania stosu wywołań, który emitował metodę dynamiczną. Aby uzyskać więcej informacji na temat anonimowo hostowanych metod dynamicznych, zobacz Przewodnik: emitowanie kodu w scenariuszach częściowego zaufania.
Jeśli metoda dynamiczna jest skojarzona z określonym modułem, metoda dynamiczna jest skutecznie globalna dla tego modułu. Może ona uzyskiwać dostęp do wszystkich typów w module i wszystkich
internal
(Friend
w Visual Basic) składowych typów. Można skojarzyć metodę dynamiczną z dowolnym modułem, niezależnie od tego, czy moduł został utworzony, pod warunkiem, że żądanie ReflectionPermission dla RestrictedMemberAccess flagi może być spełnione przez stos wywołań, który zawiera kod. Jeśli flaga ReflectionPermissionFlag.MemberAccess jest uwzględniona w przyznaniu, metoda dynamiczna może pominąć sprawdzanie widoczności kompilatora JIT i uzyskać dostęp do prywatnych danych wszystkich typów zadeklarowanych w module lub w dowolnym innym module w dowolnym zestawie.Uwaga
Po określeniu modułu, z którym jest skojarzona metoda dynamiczna, ten moduł nie może znajdować się w zestawie dostarczonym przez system, który jest używany do hostingu anonimowego.
Jeśli metoda dynamiczna jest skojarzona z określonym typem, ma dostęp do wszystkich elementów członkowskich typu, niezależnie od poziomu dostępu. Ponadto można pominąć kontrole widoczności JIT. Dzięki temu metoda dynamiczna uzyskuje dostęp do prywatnych danych innych typów zadeklarowanych w tym samym module lub w dowolnym innym module w dowolnym zestawie. Metodę dynamiczną można skojarzyć z dowolnym typem, ale kod musi zostać udzielony ReflectionPermission z RestrictedMemberAccess flagami i .MemberAccess
W poniższej tabeli przedstawiono, które typy i składowe są dostępne dla metody dynamicznej hostowanej anonimowo, z sprawdzaniem widoczności JIT i bez niego, w zależności od tego, czy ReflectionPermission flaga RestrictedMemberAccess jest udzielana.
Sprawdzanie widoczności | Bez RestrictedMemberAccess |
Z RestrictedMemberAccess |
---|---|---|
Bez pomijania kontroli widoczności JIT | Publiczne elementy członkowskie typów publicznych w dowolnym zestawie. | Publiczne elementy członkowskie typów publicznych w dowolnym zestawie. |
Pomijanie kontroli widoczności JIT z ograniczeniami | Publiczne elementy członkowskie typów publicznych w dowolnym zestawie. | Wszystkie elementy członkowskie wszystkich typów, tylko w zestawach, których poziomy zaufania są równe lub mniejsze niż poziom zaufania zestawu, który emitował metodę dynamiczną. |
W poniższej tabeli przedstawiono typy i składowe dostępne dla metody dynamicznej skojarzonej z modułem lub typu w module.
Pomiń sprawdzanie widoczności trybu JIT | Skojarzone z modułem | Skojarzone z typem |
---|---|---|
Nie. | Publiczne i wewnętrzne elementy członkowskie typów publicznych, wewnętrznych i prywatnych w module. Publiczne elementy członkowskie typów publicznych w dowolnym zestawie. |
Wszyscy członkowie skojarzonego typu. Publiczne i wewnętrzne elementy członkowskie wszystkich innych typów w module. Publiczne elementy członkowskie typów publicznych w dowolnym zestawie. |
Tak | Wszystkie elementy członkowskie wszystkich typów w dowolnym zestawie. | Wszystkie elementy członkowskie wszystkich typów w dowolnym zestawie. |
Metoda dynamiczna skojarzona z modułem ma uprawnienia tego modułu. Metoda dynamiczna skojarzona z typem ma uprawnienia modułu zawierającego ten typ.
Metody dynamiczne i ich parametry nie muszą być nazwane, ale można określić nazwy, które mają pomóc w debugowaniu. Atrybuty niestandardowe nie są obsługiwane w przypadku metod dynamicznych ani ich parametrów.
Mimo że metody dynamiczne to static
metody (Shared
metody w Visual Basic), zrelaksowane reguły powiązania delegata umożliwiają powiązanie metody dynamicznej z obiektem, tak aby działało jak metoda wystąpienia podczas wywoływania przy użyciu tego wystąpienia delegata. Przykład przedstawiający to CreateDelegate(Type, Object) przeciążenie metody.
Weryfikacja
Poniższa lista zawiera podsumowanie warunków, w których metody dynamiczne mogą zawierać nieweryfikowalny kod. (Na przykład metoda dynamiczna jest niemożliwa do zweryfikowania, jeśli jej InitLocals właściwość jest ustawiona na false
.)
- Metoda dynamiczna skojarzona z zestawem o krytycznym znaczeniu dla zabezpieczeń jest również krytyczna dla zabezpieczeń i może pominąć weryfikację. Na przykład zestaw bez atrybutów zabezpieczeń, który jest uruchamiany jako aplikacja klasyczna, jest traktowany jako krytyczny dla zabezpieczeń przez środowisko uruchomieniowe. Jeśli skojarzysz metodę dynamiczną z zestawem, metoda dynamiczna może zawierać nieweryfikowalny kod.
- Jeśli metoda dynamiczna zawierająca nieweryfikowalny kod jest skojarzona z zestawem, który ma przezroczystość na poziomie 1, kompilator just in time (JIT) wprowadza zapotrzebowanie na zabezpieczenia. Żądanie powiedzie się tylko wtedy, gdy metoda dynamiczna jest wykonywana przez w pełni zaufany kod. Zobacz Kod przezroczysty dla zabezpieczeń, poziom 1.
- Jeśli metoda dynamiczna zawierająca nieweryfikowalny kod jest skojarzona z zestawem, który ma przezroczystość poziomu 2 (na przykład mscorlib.dll), zgłasza wyjątek (wstrzykiwany przez kompilator JIT) zamiast żądać zabezpieczeń. Zobacz Kod przezroczysty dla zabezpieczeń, poziom 2.
- Anonimowo hostowana metoda dynamiczna zawierająca nieweryfikowalny kod zawsze zgłasza wyjątek. Nigdy nie może pominąć weryfikacji, nawet jeśli zostanie utworzona i wykonana przez w pełni zaufany kod.
Wyjątek zgłaszany dla niezweryfikowanego kodu różni się w zależności od sposobu wywoływanego metody dynamicznej. Jeśli wywołasz metodę dynamiczną przy użyciu delegata zwróconego z CreateDelegate metody , zostanie zgłoszony element VerificationException . Jeśli wywołasz metodę dynamiczną przy użyciu Invoke metody , TargetInvocationException metoda zostanie wyrzucona z wewnętrznym VerificationExceptionelementem .