便携式类库实际上解决了什么?

mic*_*ael 22 .net c# .net-assembly portable-class-library .net-4.5

我想知道,PCL究竟解决了什么?如果它只是限制我跨平台的类型,那么为什么微软只是通过IDE将它作为标准.NET库中的一个功能?

基本上,我可以轻松编译包含一些POCO对象的.NET库,并在我的Silverlight,WPF和Windows Store应用程序中引用该DLL,而无需重新编译或出现任何问题.是否有任何在PCL中有效的代码难以在标准.NET库中运行?


哦,我知道显然有一些东西可以在标准的.NET库中运行,我并不关心...我想我的问题是这样的:

是否有任何代码可以在可移植类库中编译,如果完全相同的代码在.NET库中,那么它将无法正常运行?

Dan*_*ted 22

两件事情:

首先,如果您打算创建一个可以在多个平台上运行的库,那么您不希望在运行时发现您不小心使用了并非在所有平台上都可用的API(通过TypeLoadException或MissingMethodException等) .因此,便携式类库只会为您所定位的所有平台上支持的API提供智能感知,并且您将在该集合之外的任何内容中获得构建错误.

其次,如果您创建的.NET Framework库仅使用所有平台上可用的API,则创建的DLL仍然无法在其他平台(即Windows Phone和Silverlight)上运行,而无需将其编译为这些平台的库.这听起来像你期望它会,这是一个合理的期望,但在过去并不是真的.可移植类库是我们开展工作的方式(事实上,如果您为Windows应用商店应用创建类库并且仅使用可用于.NET Framework和WP8的API,则生成的二进制文件将同时适用于那些平台没有变化).

  • 我的猜测是OP正试图看看PCL是否还有更多只是限制智能感知,这有... :) (2认同)
  • 好吧,这些可能是PCL的一些目标,但它们肯定还没有..Net Framework和Silverlight/WP7都有`Socket`,`IPEndPoint`等类.然而,PCL没有它们..Net Framework + XNA,Silverlight5和WP7都有`Vector3`,`Matrix`等类,但PCL没有.除了少数不兼容的框架之外,我们现在还有30个不太兼容的配置文件.而且我仍然想知道在我的函数中什么是非便携式的,它增加了两个整数,我必须使用PCL来使其便携... (2认同)

m-y*_*m-y 5

我不会太担心代码本身,但只需尝试以下内容,看看为什么便携式类库很有用.

  1. 创建一个标准的.NET 4.5类库(它可以是空的/不包含任何类).
  2. 创建Silverlight 5应用程序.
  3. 尝试从Silverlight 5应用程序引用.NET 4.5类库.

您将收到以下错误消息:

您无法添加对Demo.Utils.dll的引用,因为它不是针对Silverlight运行时构建的.Silverlight项目仅适用于Silverlight程序集.

这本身就是为什么便携式类库如此精彩的味道.困难的部分是尝试使代码适应平台不可知,这听起来很容易,但并不像你想象的那么容易.相信我,当你第一次尝试从文件夹中读取文件并意识到PCL不会让FileInfo你感到沮丧时,但微软的指导是抽象平台依赖关系并注入一个实现接口的类.实际上照顾它.事实上,这是一篇很好的文章.


另一篇有待观察的有用文章介绍了PCL设置方式的一些内部工作原理.本文将帮助您了解为什么 PCL能够针对多个平台.https://www.simple-talk.com/blogs/2013/04/19/inside-portable-class-libraries/