MethodAccessException в списке CF 2.0 <T>. Сортировка - PullRequest
3 голосов
/ 21 ноября 2008

У меня есть некоторый библиотечный код , который работает в диапазоне времени выполнения .NET (обычный, CF, Silverlight и т. Д.), Но небольшой блок кода нарушает только на CF 2.0, с MethodAccessException. Я почти уверен, что это ошибка во время выполнения, но кто-нибудь знает какие-нибудь хорошие обходные пути? Он отлично работает в CF 3.5, но мне нужно иметь возможность поддерживать и CF 2.0.

В частности, это относится к сборке библиотеки с использованием обобщенных типов, которой вызывающая сторона предоставляет не публичный T. Я не делаю ничего противного T (например, отражения), но он все равно ломается ...

Все, что он делает, это оборачивает значения и добавляет их в список, затем отсортируйте список через Comparison<>. Я также пытался Array.Sort, IComparer<Wrapper<T>>, IComparable<Wrapper<T>> и т. Д. - все терпеть неудачу таким же образом: MethodAccessException - с наконечником VS:

Если уровень доступа метода в библиотека классов изменилась, перекомпилируйте любые сборки, которые ссылаются на библиотека.

Но сделайте T общедоступным, и все это прекрасно работает ... обратите внимание, что мы никогда не сортировали по T - мы работали только с Wrapper<T> ...

Любой вклад приветствуется ...


Сборка библиотеки:

public static class LibraryClass
{
    public static void Test<T>(T foo, T bar)
    {
        // vastly simplified... I am aware that it is already in order here ;-p
        var list = new List<Wrapper<T>>();
        list.Add(new Wrapper<T> { Tag = 1, Value = foo });
        list.Add(new Wrapper<T> { Tag = 2, Value = bar });

        list.Sort((x,y) => x.Tag.CompareTo(y.Tag)); // BOOM!!
    }
}

public class Wrapper<T> // public to prove this isn't a factor...
{
    public T Value { get; set; }
    public int Tag { get; set; }
}

Вызывающая сборка:

public static class Program
{
    static void Main()
    {
        MyData foo = new MyData {Name = "foo"},
            bar = new MyData {Name = "bar"};

        LibraryClass.Test<MyData>(foo, bar);
    }
}

class MyData // but make MyData public and it works...
{
    public string Name { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 21 ноября 2008

Вы пытались написать свой собственный вид - возможно, встроенный выполняет какие-то махинации с отражением ... Не для того, чтобы использовать свой собственный в долгосрочной перспективе - но как средство устранения проблемы. Нужно быстро кодировать что-то еще и хотя бы посмотреть, что тогда.

Я полагаю, что вы не получите трассировку стека, когда она идет бум.

0 голосов
/ 23 июня 2009

Я помню, как возникали проблемы (иногда), чтобы убедиться, что на целевом устройстве есть нужный материал dotNET. Это было в dotNET CF 1.0 дней. Может ли это все еще быть проблемой здесь?

...