Visual Studio 2012 のオブジェクト ブラウザーには、ポータブル クラス ライブラリ用に 2 つの異なるコンポーネント セットが用意されています。
- .NET ポータブル サブセット
- .NET ポータブル サブセット (レガシー)
ポータブル クラス ライブラリを作成すると、.NET ポータブル サブセットが使用されます。2 番目のセットとは何ですか? どのように使用できますか? .NET Portable Subset では使用できないMEF が含まれています。
Visual Studio 2012 のオブジェクト ブラウザーには、ポータブル クラス ライブラリ用に 2 つの異なるコンポーネント セットが用意されています。
ポータブル クラス ライブラリを作成すると、.NET ポータブル サブセットが使用されます。2 番目のセットとは何ですか? どのように使用できますか? .NET Portable Subset では使用できないMEF が含まれています。
ええ、これは紛らわしいです。基本的には、オブジェクト ブラウザーにはポータブル サブセットを表す適切な方法がないためです (このバージョンでは、大幅に書き直さなければ方法を追加できませんでした)。
これを明らかにするために、次の図を検討してください。
円は、それぞれのプラットフォームの API 表面積 (原寸ではありません) を表しています。ポータブルでは、重複領域に存在する API を効果的に公開します。たとえば、上記の 3 つすべてをターゲットにする場合、3 つのプラットフォームすべてが交差するサーフェス エリア (つまり、まさに中心) に対してビルドできます。Windows ストアと .NET Framework を対象とする場合、これら 2 つのプラットフォームが交差する交差点 (つまり、中央と右下) に対してビルドできるようにします。より多くのプラットフォームをターゲットにすると、使用できる表面積が減少し、ターゲットを減らすと、使用できる表面積が増加します。考えてみれば、これは理にかなっています。組み合わせるプラットフォームが多ければ多いほど、それらの共通点は少なくなります。
これは、オブジェクト ブラウザーに表示されるものとどのように適合しますか?
オブジェクト ブラウザでは、これらの個々の共通点を簡単に公開する方法はありません (プラットフォームの数と個々のバージョンの数を考慮すると、非常に多くなります!)。その代わりに、ポータブルで使用可能なすべてのサーフェス領域 (つまり、すべての交差点を組み合わせたもの) を取得し、代わりにそれを公開しました。つまり、オブジェクト ブラウザーには、すべてのプラットフォームで "移植可能" と見なされるすべての API の組み合わせが表示されます。
そのため、MEF が表示されます。MEF は、.NET Framework と Silverlight をターゲットにする場合に使用できますが、電話または Windows ストアをターゲットに追加するとすぐに、これらのプラットフォームではサポートされていないため、MEF は失われます。
.NET ポータブル サブセットと .NET ポータブル サブセット (レガシー) の違いは何ですか?
ポータブルでは、レガシー プラットフォームと新しいプラットフォームのどちらを対象としているかに応じて、ポータビリティを有効にする 2 つの方法があります。
レガシー プラットフォーム (Phone 7.x、SL4/5、.NET 4、Xbox) の場合、複数のプラットフォーム間の共通点を見つけた場合、共通 API を表す実際のアセンブリを物理的に生成する必要があります。たとえば、Windows Phone 7 と .NET Framework を組み合わせると、これらが共有する API を含む実際の mscorlib、system、system.core などが生成されます (これらは Microsoft 側で生成されます)。これは非常に時間がかかるだけでなく、あまり有用ではないサブセットを生成する可能性があるという点で、非常に問題があります。たとえば、プラットフォーム間でネットワーク スタックのサブセットを最初に生成したとき、HttpWebRequest 接続を作成する共通の方法を作成する方法さえありませんでした。これは、古いプラットフォームでは (何らかの理由で) 誰も移植性について考えていなかったからです。
新しいプラットフォーム (.NET 4.5、Windows ストア、Phone 8) では、一歩下がって最初から移植性を設計しました。後付けとして移植性を試みるのではなく、プラットフォームがすべてをサポートするか、またはまったくサポートしない、自己完結型のコード単位を表すコントラクト (基本的にはアセンブリ) と呼ぶものを設計しました。これは、.NET Framework 4.5 で "System.IO 4.0.0.0" が表示された場合、Windows Phone 8 で表示された場合とまったく同じ API をサポートしていることを意味します。プラットフォームの交差点を表すカスタム アセンブリを作成するには、アセンブリの境界でサブセット化するだけです。たとえば、System.Runtime.dll、System.Reflection.dll、および System.Reflection.Emit.dll をサポートするプラットフォーム 1 と、System.Runtime.dll および System.Reflection.dll をサポートするプラットフォーム 2 があるとします。これらのプラットフォームをポータブルでターゲットにする場合、System.Runtime.dll と System.Reflection.dll を選択するだけです。長期的には、個々の API ではなくアセンブリの観点から考えることができるため、移植性が理解しやすくなります。
レガシ プラットフォーム用に公開されているサーフェス エリア (Mscorlib ベース) は.NET Portable Subset (Legacy)で表されますが、新しいプラットフォームでは、これは.NET Portable Subsetで表されます。
ポータブルを使用する場合、これら 2 つの表面領域を隠そうとしますが、ターゲット プラットフォームに応じて、最初または 2 番目の表面領域に対してターゲットを設定します。
これは私が計画していたよりもずっと長くなりましたが、明確な質問をしてください.
.NET Framework と .NET Compact Framework だけだった昔は、これは非常に単純でしたが、Microsoft は XNA/360、Silverlight、および Windows Phone をミックスに追加する必要がありました。
「Portable Subset (Legacy)」の正式な説明は見つかりませんが、「Portable Subset」に関するドキュメントでは Compact Framework についての言及が除外されているため、「Legacy」サブセットは Compact Framework を参照している非レガシー サブセットが XNA、SL、および WP7 を参照する場合。