WeakReference を継承するクラス WeakRef があります。このクラスは、元々、標準の .NET フレームワークを対象とする名前空間の一部でした。最近、.NET 4.5 に移行し、Portable Class Library を利用することにしました。WeakRef を含めましたが、Silverlight アプリケーションでそれを参照すると、次のランタイム例外が発生しました。
$exception {System.TypeInitializationException: 'AxisModel.ImageDownloadAlert' の型初期化子が例外をスローしました。---> System.TypeLoadException: タイプ 'Common.WeakRef`1' によって違反された継承セキュリティ ルール。派生型は、基本型のセキュリティ アクセシビリティと一致するか、アクセスしにくくする必要があります。基本クラスに非透過的な既定のコンストラクターがある場合、派生クラスにも既定のコンストラクターが必要であり、メソッドの継承規則はこれら 2 つのメソッドに適用されます。
Common.WeakRefCallbackHostCore`1..ctor(Object syncRoot)
で AxisModel.ImageDownloadAlert..ctor()
で AxisModel.ImageDownloadAlert..cctor() で--- 内部例外スタック トレースの終了 ---
AxisModel.ImageDownloadAlert.get_Instance()
で SLWebApp.App..ctor()}System.Exception {System.TypeInitializationException}
WeakReference の Silverlight バージョンには空のデフォルト コンストラクターがあることに気付きましたが、これは WeakReference の標準 .NET バージョンには当てはまりません。WeakRef には空のコンストラクターが含まれていないため、これがスローされた例外の理由だと思います。問題は、このクラスに空のコンストラクターを追加すると、WPF アプリケーションでコンパイル エラーが発生することです。
実行時エラーやコンパイル エラーを発生させることなく、Silverlight アプリケーションと WPF アプリケーションの間で WeakRef を共有する方法はありますか? 低侵襲のソリューションを探しています。
アップデート:
Silverlight での WeakReference の継承に関して、いくつかの議論がありました。どうやらそれは不可能なので、代わりに WeakReference インスタンスを含むクラスを作成する必要があります。ただし、WeakReference が含まれているかどうかに関係なく、Silverlight 定義には空の既定のコンストラクターがあり、.NET Framework 定義には含まれていないという点で、WeakReference に似たクラスから継承することは可能でしょうか?
ディスカッションは次の場所にあります。
Silverlight で ReflectionTypeLoadException をスローする継承された WeakReference