4

我有一些可在一系列 .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; }
}
4

2 回答 2

2

您是否尝试过编写自己的排序 - 也许内置的正在做一些反射恶作剧......不是为了长期使用您自己的 - 而是作为调试问题的一种手段。应该很快地在其他东西中编码,至少看看是什么。

我认为当它繁荣时你不会得到堆栈跟踪。

于 2008-11-21T08:14:38.557 回答
0

我记得(有时)在确保目标设备上存在正确的 dotNET 时遇到了麻烦。这是在 dotNET CF 1.0 天。这仍然是这里的问题吗?

于 2009-06-23T09:03:25.763 回答