我有一些library code适用于一系列.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; }
}
答案 0 :(得分:2)
你是否尝试过编写自己的类型 - 也许内置的是做一些反思的恶作剧......不是为了长期使用你自己的 - 而是作为调试问题的一种手段。应该快速编写其他内容,至少可以看到它们是什么。
我认为你在繁荣时不会得到堆栈跟踪。
答案 1 :(得分:0)
我记得有时会遇到麻烦,以确保正确的dotNET内容在目标设备上。这是在dotNET CF 1.0天。这可能仍然是问题吗?