什么是.NET Portable Subset(Legacy)?

15
在 Visual Studio 2012 中的对象浏览器为便携式类库提供了两个不同的组件集:
  • .NET Portable Subset
  • .NET Portable Subset(Legacy)
当我创建便携式类库时,它使用 .NET Portable Subset。第二个集合是什么,我该如何使用它?它包含 MEF,而在 .NET Portable Subset 中却无法使用
2个回答

32

这确实有些令人困惑,基本上是因为“对象浏览器”没有很好的方式(而且我们在不进行重大改写的情况下无法添加方式)来表示可移植子集。

为了帮助解释这一点,请考虑以下图表:

API Intersection

圆圈代表各自平台的 API 表面(不按比例)。在可移植方案中,我们有效地公开了存在于重叠区域中的 API。例如,当针对以上三个目标时,我们允许您构建针对所有三个平台相交的表面区域的代码(即正中心)。当针对 Windows Store 和 .NET Framework 时,我们允许您构建针对那两个平台相交的表面区域的代码(即中心和右下角)。目标更多的平台时,您可以使用的可用表面积会减少,目标较少的平台时,则可以增加可用表面积。如果您想一想,这很有道理:合并的平台越多,它们共同的部分就越少。

这与您在“对象浏览器”中看到的内容有什么关系?

在“对象浏览器”中,我们没有简单的方法来公开这些单个相交部分(考虑到平台数量+各自版本的因素,这很多)。因此,我们所做的是获取可移植方案中所有可用表面积(即所有相交部分组合),并公开它们。这意味着“对象浏览器”向您显示了我们认为在所有平台上都是“可移植”的 API 的组合。

这就是您看到 MEF 的原因。当您针对 .NET Framework 和 Silverlight 时,MEF 是可用的,但是一旦将电话或 Windows Store 添加到目标中,您会失去它,因为它在这些平台上不受支持。

.NET Portable Subset 和 .NET Portable Subset (Legacy) 有什么区别?

在可移植方案中,我们有两种方式来实现可移植性,具体取决于您是针对我们称之为遗留平台还是新平台进行定位。

对于旧平台(Phone 7.x、SL4/5、.NET 4、Xbox),当我们需要生成多个平台之间的交集时,需要实际生成代表公共API的实际程序集。例如,当您结合Windows Phone 7和.NET Framework时,我们会生成(这些是在微软内部生成的)一个包含它们共享的API的实际mscorlib、system、system.core等。这不仅非常耗时,而且极其问题复杂,因为它可能会生成不太有用的子集。例如,当我们首次为跨平台网络堆栈生成子集时,甚至没有一种方法来创建普遍的HttpWebRequest连接。这是因为在旧平台上(出于任何原因),没有人考虑过可移植性。
对于新平台(.NET 4.5、Windows Store、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"表示。
在使用portable时,我们尝试隐藏这两个表面区域,但在底层,我们根据您的目标平台将您的应用程序定位到第一个或第二个表面区域。

这篇文章比我预想的要长很多,但你可以随时提出澄清问题。过去3年里,我一直在专注于这个领域,所以有些东西可能会被我忽略了。


更长但非常棒!感谢您以良好的细节水平进行解释。 - Ladislav Mrnka
1
我曾经找到的最有帮助的答案之一。感谢您抽出时间。偶尔从内部获得关于事情如何完成的反馈是很好的 :) - Aurelien Ribon
1
虽然这个答案很好,也很全面 +1,但我留下的印象是微软彻底搞砸了.NET。现在我的情况是,大部分我的C# .NET核心框架代码可以通过Xamarin在iOS和Android上编译,但我发现它在Windows Phone 8上完全崩溃了,因为他们省略了基本的核心功能(如Serializable属性、压缩、加密、NameValueCollection等)。这对微软来说是一场灾难。难怪没有人在开发WP8应用程序。他们已经完蛋了。 - Herman Schoenfeld

0

以前只有.NET Framework和.NET Compact Framework,这个问题就简单多了。但是微软又加入了XNA/360、Silverlight和Windows Phone,让这个问题变得更加复杂。

我找不到任何关于“Portable Subset(Legacy)”的官方描述,但是关于“Portable Subset”的文档中排除了对Compact Framework的提及,所以我的猜测是,“Legacy”子集如果非“Legacy”子集指的是XNA、SL和WP7,那么它应该是指Compact Framework。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接