22

我想知道,PCL 实际上解决了什么问题?如果它所做的只是限制我了解哪些类型是跨平台的,那么微软为什么不通过 IDE 将其作为标准 .NET 库中的一个功能呢?

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


哦,我知道显然有些东西可以在标准 .NET 库中使用,我对此并不担心......我想我的问题是:

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

4

5 回答 5

22

两件事情:

首先,如果您的意图是创建一个在多个平台上工作的库,您不想在运行时发现您不小心使用了并非在所有平台上都可用的 API(通过 TypeLoadException 或 MissingMethodException 或其他东西) . 因此,可移植类库只会为您提供针对您所针对的所有平台支持的 API 的智能感知,并且对于该集合之外的任何内容,您都会遇到构建错误。

其次,如果您创建的 .NET Framework 库仅使用在所有平台上都可用的 API,则创建的 DLL 仍然无法在其他平台(即 Windows Phone 和 Silverlight)上运行,除非将其编译为这些平台的库。听起来您期望它会,这是一个合理的期望,但过去并非如此。可移植类库是我们实现该功能的方式(事实上,如果您为 Windows 应用商店应用程序创建一个类库并且仅使用可用于 .NET Framework 和 WP8 的 API,则生成的二进制文件同时适用于这两者那些平台不变)。

于 2013-05-03T00:05:12.777 回答
5

我不会太担心代码本身,但只需尝试以下内容,看看为什么可移植类库很有用。

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

您将收到以下错误消息:

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

就其本身而言,这只是对便携式类库为何如此美妙的一种品味。困难的部分是尝试使代码与平台无关,这听起来很容易,但并不像您想象的那么容易。相信我,当您第一次尝试从文件夹中读取文件并意识到 PCL 不允许FileInfo时您会感到沮丧,但 Microsoft 的指导是抽象平台依赖项并注入一个实现接口的类实际上会照顾它。事实上,这是一篇很好的文章


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

于 2013-05-02T21:10:22.793 回答
3

我创建了一个关于什么是可移植类库的简单 youtube 视频,您可以从这里看到它http://www.youtube.com/watch?v=DcBfjdDHlxo

但是让我在这里更详细地回答一下。创建类库项目的全部意义在于可重用性。现在,我们不仅希望在 .NET 应用程序中实现这种可重用性,也不需要跨 .NET 应用程序,而是跨不同类型的 .NET 应用程序。现在不同类型的 .NET 应用程序意味着 WPF、Windows、Silver light、Windows phone 等。 在此处输入图像描述

现在,这些应用程序类型中的每一种都具有不同的 .NET 框架。

例如,在银光应用程序中,如果您尝试引用一个简单的“类项目”,则会以以下错误结束。这就是可移植类库有用的地方。通过创建可移植类,我们可以在任何类型的 .NET 项目类型中引用它。

于 2013-09-02T04:32:58.123 回答
2

可移植类库究竟解决了什么问题?

最终它会解决很多问题!(像 Java,但在本世纪)

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

按原则我认为不是,不是相反吗?

但我认为,恕我直言,您实际上可能没有抓住重点

想想复制/粘贴代码、项目克隆、链接代码、条件编译器指令(甚至是 T4 模板?),最终结果是引用DLL Hell和不必要的复杂性、样板、冗长(不是很优雅,对吗?)

它们不是二进制不兼容的解决方法吗?

它很早,但我认为这是一个很棒的方向,主要是当你看到 Xamarin 和 Mono 正在支持 pcl 时(他们已经部分支持),我认为这是它唯一可以从 Html 和 Javascript 狂热或代码生成器中拯救的东西。(TypeSafe 万岁!)

PCL 还可以将 c# 军队从 Windows 中解放出来

(但这一切只是我的看法)

于 2013-05-02T20:29:55.790 回答
1

当您在 Visual Studio 2012 中进行开发时,可移植类库中存在一些与 .NET Framework 4 相关的 API 差异。这主要涉及System.NetSystem.Xml命名空间中的一些属性和方法。有关详细信息,请参阅MSDN 页面。

于 2013-05-02T18:58:31.620 回答