7

利用可能な場合、プラットフォームからの実装を使用するポータブル クラス ライブラリを構築しようとしています。たとえば、Lazy<T>.NET 4.5、Windows ストア アプリ、Windows Phone 8 では利用できますが、Windows Phone 7、Silverlight 4 では利用できません。PCL がLazy<T>実装されているプラ​​ットフォームの 1 つに読み込まれている場合、プラットフォームの実装。プラットフォームで利用できない場合は、独自の実装を使用したいと考えています。Microsoft BCL がやっているので可能のようですが、実装方法がわかりません。

TypeForwardedToAttributeを使用することで、PCL をリダイレクトしてプラットフォームからの実装を使用できることを読みました。この結果を達成するために Visual Studio プロジェクトを構成する方法がよくわかりません。CoreLibが私のライブラリで、ShimLibに私の実装が含まれてLazy<T>いる場合 TypeForwardedToAttribute はどこに追加すればよいですか? この属性には実際の Type 参照が必要ですがtypeof(System.Lazy<>)、PCL で Windows Phone 7 がターゲットになっている場合は機能しません。Windows Phone 7 を削除すると、CoreLib から ShimLib への参照を追加できなくなります。どうすればこれを処理できますか?

はい、Lazy<T>実装が非常に簡単であることはわかっていますが、これは単なる例であり、私の実際の状況は、実装がそれほど簡単ではないさらに多くのクラスに当てはまります。

4

2 に答える 2

5

型転送の原則的な考え方は、この質問とこの記事で非常によく説明されているため、ここでは詳細を繰り返しません。ただし、要約すると、ライブラリによって置き換えられるライブラリを参照していても、ライブラリを再コンパイルA せずに再利用できるようにするという考え方です。そのためには、参照を library に転送するように library を変更する必要があります。これはまさに TypeForwardedTo 属性が行うことです。BCBC

これはどのように役立ちますか? すべてのプロジェクトで参照されるようなものを作成できますShimLibが、条件付きコンパイルと型転送を使用して、フレームワーク ライブラリが存在する場合はそれらにリンクします。幸いなことに、誰かがすでに あなたのためにそれを行っています:)

Matt のコメントに応じて編集: そうです、Theraot が元の実装にフォールバックしないことを見落としていました。そして、再コンパイルせずにそれを達成するのは非常に難しいと思います。あなたができる最善の方法は、おそらくこの戦略に従うことです。つまり、フレームワークのバージョンごとに異なるビルド構成を使用することです。そうすれば、条件付きでコンパイルできますTypeForwardedToAttribute。少なくとも、これにより、コードを複製する必要がなくなります。異なるバージョンのコードを本当に配布したくない場合は、フレームワークのバージョンを決定し、このバージョンのビルド構成を使用してコンパイルされたアセンブリのバージョンを読み込むブートストラップを実装できます。

于 2013-08-19T06:37:09.927 に答える