【问题标题】:What is .NET Portable Subset (Legacy)?什么是 .NET 可移植子集(旧版)?
【发布时间】:2012-09-11 03:02:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net mef visual-studio-2012 portable-class-library


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      圆圈代表各个平台的 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 表示子集

      使用便携式时,我们会尝试隐藏这两个表面区域,但在幕后,我们会根据您的目标平台将您的目标对准第一个或第二个表面区域。

      这比我计划的要长得多,但请随时提出澄清问题,在过去的 3 年里我一直在生活和呼吸,所以我倾向于不加思索地跳过一些事情。

      【讨论】:

      • 更长但很棒!感谢您详细解释。
      • 我找到的最有帮助的答案之一。感谢您抽出宝贵的时间。很高兴不时从内部获得有关事情如何完成的反馈:)
      • 虽然答案很好而且很全面 +1,但我留下的印象是微软完全搞砸了 .NET。我现在处于这样一个位置,我的大部分 C# .NET 核心框架代码在 iOS 和 Android 上都可以正常编译(通过 Xamarin),但我发现现在 Windows Phone 8 完全崩溃了,因为它们省略了基本的核心功能(比如 Serializable属性、压缩、加密、NameValueCollection 等)。这对微软来说是一场灾难。难怪没有人构建 WP8 应用程序。他们已经完成了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多