为什么有些NuGet软件包同时提供了可移植库和特定于平台的软件包?

据我所知,可移植类库可以在许多平台上使用,基于库设计者选择支持的框架子集。

我注意到许多可通过NuGet获得的库也包含一个特定于平台的实现,并想知道这需要什么。

例如, Microsoft.Net.Http包附带了许多变体,包括:

  • Net 4.0版本
  • WinRT(Windowsapp store应用)Windows 8版
  • 便携式类库支持Net 4.0,WinRT等

为什么需要分发单独的.Net 4.0或WinRT版本的库? 便携式类库是否足够?

当我设计自己的自定义便携式库时,我应该遵守这个惯例吗?

为了清楚起见,我不是在讨论需要一小部分平台特定代码才能工作的可移植类库。 那些通常有一个附带的托管库,其名称以.PlatformServices结尾。 但我在谈论由NuGet包分发的核心库。

当然,PCL版本可能足以满足您的需求。 但是,由于您必须在创建自己的PCL类库项目时发现,因此您可以在PCL项目中实际使用的.NET Framework类和方法的子集相当小。 该子集是通过获取完整的.NET Framework并减去不能在另一个平台上工作的部分来创建的。

最严格的平台是Silverlight和Phone7,它们基于CLR的.NETCore版本。 和Store和Phone8,基于WinRT api提供的服务。 针对这些中的任何一个都会迅速减少您在库中可以执行的操作的数量。

Microsoft.Net.Http包已经过优化,如果您不受其中一个受限平台的限制,仍然可以使一些Http相关方法和属性可用。 您可以在packages子目录中看一下,提供IntelliSense的System.Net.Http.Extensions.xml文件向您展示了在一个平台上可能实现的function,而不是另一个平台上可能实现的function。 我知道了:

  • HttpWebRequest.AllowAutoRedirect
  • AuthenticationManager.PreAuthenticate
  • HttpWebRequest.ProtocolVersion
  • HttpRequestHeaders.TransferEncodingChunked
  • HttpClientHandler.UseProxy

请注意,这些属性使用扩展方法进行映射。