2

既存のクラスライブラリをSilverlightに移植しています。ラムダ式のコンパイルを頻繁に使用しましたが、そのためにセキュリティの問題が発生しています。

特に、クライアントSLアプリの匿名クラスがラムダ式に参加している場合、それをコンパイルできません。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ましたが、役に立ちませんでした。実際には役立つはずですが、なぜ役に立たないのか理解できません。

何か案は?

更新
問題はラムダ式ではなく、動的なジェネリックメソッドの呼び出しにあることがわかりました:

クラスライブラリに次のコードがある場合:

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内のパラメーターをジェネリックではなくタイプと見なしているようです。また、ライブラリからアクセスできないため、その呼び出しを禁止しています。ProcessInternalClassTInternalClass

バグのようですね。

4

1 に答える 1

2

解決済み: 次のコードを AssemblyInfo.cs に追加します。

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

Silverlight フォーラムで議論

于 2009-11-25T15:42:01.383 に答える