- .NET Portable Subset
- .NET Portable Subset(Legacy)
这确实有些令人困惑,基本上是因为“对象浏览器”没有很好的方式(而且我们在不进行重大改写的情况下无法添加方式)来表示可移植子集。
为了帮助解释这一点,请考虑以下图表:
圆圈代表各自平台的 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连接。这是因为在旧平台上(出于任何原因),没有人考虑过可移植性。这篇文章比我预想的要长很多,但你可以随时提出澄清问题。过去3年里,我一直在专注于这个领域,所以有些东西可能会被我忽略了。
以前只有.NET Framework和.NET Compact Framework,这个问题就简单多了。但是微软又加入了XNA/360、Silverlight和Windows Phone,让这个问题变得更加复杂。
我找不到任何关于“Portable Subset(Legacy)”的官方描述,但是关于“Portable Subset”的文档中排除了对Compact Framework的提及,所以我的猜测是,“Legacy”子集如果非“Legacy”子集指的是XNA、SL和WP7,那么它应该是指Compact Framework。