【问题标题】:Silverlight security: giving a permission to access anonymous classes to a class librarySilverlight 安全性:授予对类库访问匿名类的权限
【发布时间】:2009-11-25 11:03:31
【问题描述】:

我正在将现有的类库移植到 Silverlight。我经常使用 lambda 表达式编译,现在我正因为它而遇到安全问题。

特别是,如果来自客户端 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)

我尝试在客户端 SL 应用程序中使用 InternalsVisibleTo 向我的类库公开匿名类,但它没有帮助。实际上它应该有帮助,但我不明白为什么它没有。

有什么想法吗?

更新
我发现问题不在于 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,因此禁止其调用。

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

【问题讨论】:

    标签: silverlight security anonymous-types internalsvisibleto


    【解决方案1】:

    已解决:将以下代码添加到您的 AssemblyInfo.cs:

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

    Discussed 在 Silverlight 论坛中

    【讨论】:

      猜你喜欢
      • 2014-04-07
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多