我将现有的类库移植到Silverlight。我使用lambda表达式编译了很多,现在由于它而遇到了安全问题。Silverlight安全:授予访问匿名类到类库的权限
特别是,如果从客户端SL应用程序的匿名类是参与lambda表达式,我不能编译:我得到以下堆栈跟踪MethodAccessException
:
MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags)
RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
MethodBase.Invoke(Object obj, Object[] parameters)
Expression.Lambda(Type delegateType, Expression body, IEnumerable<T> parameters)
Expression.Lambda(Type delegateType, Expression body, ParameterExpression[] parameters)
Expression.Lambda(Expression body, ParameterExpression[] parameters)
我试图用InternalsVisibleTo
在客户端SL应用程序中向我的类库公开匿名类,但它没有帮助。其实它应该有所帮助,但我不明白为什么它没有。
任何想法?
UPDATE:
我已经想通了,这个问题是不是在lambda表达式,但在动态泛型方法调用:
如果我们有一个类库下面的代码:
public class LibClass
{
public static void StaticReceive<T>(T x)
{
Process<T>(x);
}
public static void DynamicReceive(object x)
{
typeof(LibClass).GetMethod("Process", BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(x.GetType())
.Invoke(null, new object[] { x });
}
static void Process<T>(T x)
{
// some work with typed x
}
}
我们称之为从应用程序的StaticReceive方法是这样的:
class InternalClass { }
void MethodInUserApp()
{
var x = new InternalClass();
LibClass.StaticReceive(x);
}
它工作正常,但如果我们使用DynamicReceive
,它会失败。看起来像CLR认为Process
方法中x
参数的类型为InternalClass
,而不是通用的T
,并且由于InternalClass
不可用于库,因此禁止其调用。
它看起来像一个错误,不是?