Здравствуйте, _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...