4

さまざまな.NETランタイム(通常、CF、Silverlightなど)で動作するライブラリコードがいくつかありますが、コードの小さなブロックはCF2.0でのみ壊れていMethodAccessExceptionます。ランタイムのバグだと確信していますが、誰かが良い回避策を知っていますか?CF 3.5では正常に動作しますが、CF2.0もサポートできる必要があります。

T具体的には、これはジェネリックスを使用したライブラリアセンブリに関連しており、呼び出し元によって非公開になります。(反射など)嫌なことは何もしませんがT、とにかく壊れます...

値をラップしてリストに追加し、を介してリストを並べ替えるだけComparison<>です。私も試しましArray.SortIComparer<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 に答える