2009-11-25 54 views
2

我将现有的类库移植到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不可用于库,因此禁止其调用。

它看起来像一个错误,不是?

回答

2

解决:下面的代码添加到您的AssemblyInfo.cs:在Silverlight的论坛

[assembly: InternalsVisibleTo("System.Core, PublicKey=" + 
"00240000048000009400000006020000002400005253413100040000010001008d56c76f9e8649" + 
"383049f383c44be0ec204181822a6c31cf5eb7ef486944d032188ea1d3920763712ccb12d75fb7" + 
"7e9811149e6148e5d32fbaab37611c1878ddc19e20ef135d0cb2cff2bfec3d115810c3d9069638" + 
"fe4be215dbf795861920e5ab6f7db2e2ceef136ac23d5dd2bf031700aec232f6c6b1c785b4305c" + 
"123b37ab")] 

Discussed