15

Visual Studio 2012 中的对象浏览器为可移植类库提供了两种不同的组件集:

  • .NET 可移植子集
  • .NET 可移植子集(旧版)

当我创建可移植类库时,它使用 .NET 可移植子集。第二组是什么,我该如何使用它?它包含在 .NET Portable Subset 中不可用的MEF 。

4

2 回答 2

32

是的,这很令人困惑,基本上是因为对象浏览器没有一个好的方法(并且我们无法在这个版本中添加一种方法而无需进行重大重写)来表示可移植子集。

为了帮助阐明这一点,请考虑下图:

API 交叉口

圆圈代表各个平台的 API 表面积(未按比例)。在可移植性中,我们有效地公开了存在于重叠区域中的 API。例如,当针对上述所有三个时,我们让您针对所有三个平台相交的表面区域(即最中心)进行构建。当面向 Windows 应用商店和 .NET Framework 时,我们允许您针对这两个平台相交的交叉点(即中心和右下角)进行构建。瞄准更多平台,你可以使用的可用表面积减少,瞄准更少的平台,你可以使用的表面积增加。如果您考虑一下,这是有道理的,您组合的平台越多,它们的共同点就越少。

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

在对象浏览器中,我们没有一种简单的方法来公开这些单独的交叉点(当您考虑平台数量 + 单独版本时,有很多!)。因此,相反,我们所做的是抓取便携式设备中的所有可用表面区域(即所有交叉点的组合),然后将其暴露出来。这意味着对象浏览器向您展示了我们认为跨所有平台“可移植”的所有 API 的组合。

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

.NET 可移植子集和 .NET 可移植子集(旧版)有什么区别?

在可移植性方面,我们有两种启用可移植性的方法,具体取决于您是针对我们所说的旧平台还是新平台。

对于遗留平台(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),我们退后一步,从一开始就设计了可移植性。我们没有尝试将可移植性作为事后的想法,而是设计了我们所谓的合约(基本上是程序集),它代表一个独立的代码单元,平台要么支持全部,要么不支持。这意味着当您在 .NET Framework 4.5 上看到“System.IO 4.0.0.0”时,它支持的 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 年里我一直在生活和呼吸,所以我倾向于跳过一些事情而不考虑它。

于 2012-09-21T21:52:59.210 回答
0

在过去,当它只是 .NET Framework 与 .NET Compact Framework 时,这要简单得多,但微软只需要添加 XNA/360、Silverlight 和 Windows Phone 就可以了。

我找不到“可移植子集(旧版)”的任何官方描述,但有关“可移植子集”的文档不包括紧凑框架的提及,所以我的猜测是“旧版”子集指的是紧凑框架,如果它是非传统子集是指 XNA、SL 和 WP7 的情况。

于 2012-09-18T19:51:41.197 回答