使用LinqBridge时获取MethodAccessException
问题描述:
我试图在Compact Framework 2.0中使用LinqBridge,但在调用Linq Where
方法时出现MethodAccessException。使用LinqBridge时获取MethodAccessException
首先,我尝试使用BitBucket的预编译程序集,我自己的fork有一些小的tweeks编译为CF,ctacke的fork来自他的sdf repo在gitHub上。
我一直在关注构建之间的清理和清理设备上的部署目录。此外,我已经使用DotPeek进行了反编译,以确认LinqBridge中应该公开的所有内容都显示为公开。
更新1
我用下面的代码和它工作正常
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
foreach (TSource source1 in source)
{
if (predicate(source1))
yield return source1;
}
}
更新2
使用紧凑架构2.0跑时下面的代码引发MethodAccessException之前(使用两个从raboof和ctacke的fork中预编译dll),但在CompactFamework 3.5(使用LinqBridge而不是System.Core)或FullFramework 2.0中,不是而是。所以我怀疑这是Compact Framework 2.0 CLR中的一个错误。
using System.Linq;
static class Program
{
private enum Something { a, b, c };
[MTAThread]
static void Main()
{
var dict = new Dictionary<Something, Something>();
dict.Add(Something.a, Something.a);
dict.RemoveByValue(Something.a);
}
}
public static class DictionaryExtentions
{
public static void RemoveByValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TValue value)
{
foreach (var item in dict.Where(kvp => kvp.Value.Equals(value)).ToArray())
{
dict.Remove(item.Key);
}
}
}
答
该问题似乎是由于在Where调用中使用私有类型作为TSource。这有点高于我的理解水平,但我怀疑这个问题可能是由于编译器生成的代码(称为显示类)用于包装lambda表达式。 如果有人对此有更好的理解,可随时发布答案
奇数。上周我将LINQBridge源代码移植到了SDF中,用于CF 2.0项目,并且它工作正常。可能是工作检查你的反对。 https://github.com/ctacke/sdf – ctacke
查看我的更新。它似乎只在罕见的情况下发生,但我怀疑它可能是CLR中的一个错误。 – bit2know