0

我试图在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); 
     } 
    } 
} 
+0

奇数。上周我将LINQBridge源代码移植到了SDF中,用于CF 2.0项目,并且它工作正常。可能是工作检查你的反对。 https://github.com/ctacke/sdf – ctacke

+0

查看我的更新。它似乎只在罕见的情况下发生,但我怀疑它可能是CLR中的一个错误。 – bit2know

回答

0

该问题似乎是由于在Where调用中使用私有类型作为TSource。这有点高于我的理解水平,但我怀疑这个问题可能是由于编译器生成的代码(称为显示类)用于包装lambda表达式。 如果有人对此有更好的理解,可随时发布答案

相关问题