0

Compact Framework 2.0에서 LinqBridge를 사용하려고하지만 Linq Where 메서드가 호출 될 때 MethodAccessException이 발생합니다.LinqBridge를 사용할 때 MethodAccessException이 발생합니다.

처음에는 BitBucket의 사전 컴파일 된 어셈블리를 사용하려고했지만, CF를 위해 컴파일 할 때 약간의 트위크가있는 자신의 포크와 gitHub의 sdf 레포에서 ctacke의 포크를 컴파일하려고 시도했습니다.

빌드 사이를 청소하고 장치에서 배치 디렉토리를 청소하는 데주의해야했습니다. 또한 DotPeek를 사용하여 역 컴파일을 수행하여 LinqBridge의 모든 항목이 공개되어야 함을 확인했습니다. 모두 사용

나는 다음과 같은 코드를 사용하고 컴팩트 프레임 워크 2.0을 사용하여 실행할 때 다음 코드는에서는 MethodAccessException을 던져 2

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; 
    } 
} 

업데이트를 작동되기 전에 업데이트 1

(raboof 및 ctacke의 포크에서 미리 컴파일 된 dll)이지만 은 Compact Famework 3.5 (System.Core 대신 LinqBridge 사용) 또는 Full Framework 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

Odd. 지난 주 CF 2.0 프로젝트에서 LINQBridge 소스를 SDF로 가져 와서 정상적으로 작동했습니다. 네가 그 일에 대해 검사 할 수도 있겠지. https://github.com/ctacke/sdf – ctacke

+0

내 업데이트보기. 희소 한 상황에서만 발생하는 것으로 보이지만 CLR의 버그 일 수 있습니다. – bit2know

답변

0

문제는 Where 호출에서 TSource로 개인 형식을 사용하는 것으로 보입니다. 이는 이해 수준보다 약간 높지만 문제는 lambda를 래핑하는 데 사용되는 표시 클래스로 알려진 컴파일러 생성 코드 때문일 것으로 생각됩니다. 누구든지이 점에 대해 더 잘 이해하면 답변을 게시 할 수 있습니다.