Re: Expression и области видимости
От: Пельмешко Россия blog
Дата: 06.08.10 08:15
Оценка: 88 (5)
Здравствуйте, _FRED_, Вы писали:

_FR>Формирую некоторое expression, внутри которого есть Expression.Call приватного метода (возможно, добытого с помощью рефлекшен, а, возможно имеющегося в области видимости кода, создающего expression, но не видимого из внешнего мира). Компилирую такой expression и возвращаю наружу делегат.


_FR>Могут ли быть какие-то проблемы с вызовом этого делегата с безопастностью или верификацией из-за того, что внутри него используется "невидимый" код?


Компилятор expressions создаёт DynamicMethod следующим конструктором:
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility)

с последним параметром, установленным в true. То есть компилятор expressions компилирует метод с ограниченно отключенными проверками видимости (что на Silverlight 3 позволяет в полной мере лазить по приватным полям любых типов , что не сделаешь обычным рефлекшеном).

Открываем msdn, находим:
The following table shows which types and members are accessible to an anonymously hosted dynamic method,
with and without JIT visibility checks, depending on whether ReflectionPermission  with the RestrictedMemberAccess flag is granted.

                                  Without RestrictedMemberAccess          With RestrictedMemberAccess

Without skipping                  Public members of public                Public members of public
JIT visibility checks             types in any assembly.                  types in any assembly.

Skipping JIT visibility           Public members of public                All members of all types, only in assemblies whose
checks, with restrictions         types in any assembly.                  trust levels are equal to or less than the trust level
                                                                          of the assembly that emitted the dynamic method.

То есть если Вы в full trust'е, то можно ни о чём не беспокоиться
Компилятор C# точно так же частенько генерирует дерево с вызовами приватных методов и ничего страшного

Другое дело, если нету пермишенов RestrictedMemberAccess и ReflectionEmit...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.