Что такое .NET Portable Subset (Legacy)? - программирование
Подтвердить что ты не робот

Что такое .NET Portable Subset (Legacy)?

Браузер объектов в Visual Studio 2012 предлагает два разных набора компонентов для переносимых библиотек классов:

  • .NET Portable Subset
  • .NET Portable Subset (Legacy)

Когда я создаю Portable Class Library, он использует .NET Portable Subset. Что такое второй набор и как его использовать? Он содержит MEF, который недоступен в .NET Portable Subset.

4b9b3361

Ответ 1

Да, это путает, и в основном потому, что Object Browser не имеет хорошего способа (и мы не смогли добавить способ в этой версии без существенного переписывания) для представления переносного подмножества.

Чтобы помочь пролить свет на это, рассмотрим следующую диаграмму:

API Intersection

Круги представляют площадь поверхности API (не для масштаба) соответствующих платформ. В переносном режиме мы эффективно раскрываем API, которые существуют в перекрывающихся областях. Например, при таргетинге на все три выше мы позволяем вам строить против поверхности, где пересекаются все три платформы (то есть самый центр). При таргетинге на Windows Store и .NET Framework мы позволяем вам строить против пересечения, где эти две платформы пересекаются (то есть в центре и внизу справа). Увеличивается целевая платформа, и доступная площадь поверхности, которую вы используете, уменьшается, уменьшаются площади платформ и увеличивается площадь поверхности, которую вы используете. Если вы думаете об этом, это имеет смысл, чем больше платформ, которые вы объедините, тем меньше у них общего.

Как это соотносится с тем, что вы видите в обозревателе объектов?

В обозревателе объектов у нас нет простого способа разоблачить эти отдельные пересечения (и когда вы учитываете количество платформ + отдельные версии, там много!). Поэтому вместо этого мы сделали захват всей доступной площади поверхности в переносном (т.е. Все перекрестки в сочетании), а вместо этого разоблачим это. Это означает, что в обозревателе объектов отображается комбинация всех API-интерфейсов, которые мы считаем "переносимыми" на всех платформах.

Вот почему вы видите MEF. MEF доступен, когда вы нацеливаете .NET Framework и Silverlight, но как только вы добавляете Phone или Windows Store в свои цели, вы теряете его, потому что он не поддерживается на этих платформах.

Какая разница между .NET Portable Subset и .NET Portable Subset (Legacy)?

В переносном режиме у нас есть два способа включить переносимость в зависимости от того, настроены ли вы на то, что мы называем устаревшими платформами или новыми платформами.

Для устаревших платформ (Phone 7.x, SL4/5,.NET 4, Xbox), когда мы сталкиваемся с пересечениями между несколькими платформами, нам необходимо физически генерировать фактические сборки, которые представляют общие API. Например, при объединении Windows Phone 7 и .NET Framework мы генерируем (с нашей стороны, в Microsoft) реальный mscorlib, system, system.core и т.д., Которые содержат API, которыми они обладают. Это не только очень много времени, но и чрезвычайно проблематично, поскольку оно может генерировать не очень полезные подмножества. Например, когда мы впервые сгенерировали подмножество сетевого стека между платформами, не было даже способа создать общий способ создания соединения HttpWebRequest. Это было связано с тем, что на старых платформах (по какой-либо причине) никто не думал о переносимости.

Для новых платформ (.NET 4.5, Windows Store, Phone 8) мы сделали шаг назад и разработали переносимость с самого начала. Вместо того, чтобы пытаться переносимость в качестве запоздалой мысли, мы разработали то, что мы называем контрактами (в основном, сборками), которые представляют собой автономную единицу кода, поддерживаемую платформой или ни одна из них. Это означает, что когда вы видите "System.IO 4.0.0.0" на .NET Framework 4.5, он поддерживает те же API, которые вы увидите, когда увидите его на Windows Phone 8. Это делает переносимость очень простой, вместо того, чтобы генерировать пользовательские сборки для представления пересечения платформы, мы просто подмножаемся на границе сборки. Например, с учетом платформы 1, которая поддерживает System.Runtime.dll, System.Reflection.dll и System.Reflection.Emit.dll и платформу 2, которая поддерживает System.Runtime.dll и System.Reflection.dll. Когда вы нацеливаете эти платформы на портативные компьютеры, мы просто выбираем System.Runtime.dll и System.Reflection.dll. В долгосрочной перспективе это делает переносимость намного понятнее, поскольку вы можете думать в терминах сборок вместо отдельных API.

Площадь поверхности (основанная на Mscorlib), которая отображается для устаревших платформ, представлена ​​.NET Portable Subset (Legacy), тогда как для новых платформ это представлено .NET Portable Subset.

При использовании переносного устройства мы пытаемся скрыть эти две области поверхности, но под крышками мы нацелим вас против первой или второй поверхности в зависимости от ваших целевых платформ.

Это намного дольше, чем я планировал, но не стесняйтесь задавать уточняющие вопросы, я живу и дышу этим в течение последних 3 лет, поэтому я склонен пропускать вещи, не задумываясь об этом.

Ответ 2

Это было намного проще в прежние времена, когда это было просто .NET Framework vs .NET Compact Framework, но Microsoft просто должна была добавить XNA/360, Silverlight и Windows Phone в микс.

Я не могу найти никакого официального описания "Portable Subset (Legacy)", но документация о "Portable Subset" исключает упоминания Compact Framework, поэтому я предполагаю, что подмножество "Legacy" относится к Compact Framework если это случай, когда подмножество non-Legacy относится к XNA, SL и WP7.