2

我正在将现有的类库移植到 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)

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

有任何想法吗?

更新
我发现问题不在于 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 将方法中的x参数Process视为 type InternalClass,而不是 generic T,并且由于InternalClass库无法访问,因此禁止其调用。

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

4

1 回答 1

2

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

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

在 Silverlight 论坛中讨论

于 2009-11-25T15:42:01.383 回答