如何解决PCL引用

本文关键字:PCL 引用 解决 何解决 | 更新日期: 2023-09-27 17:52:16

我目前正在寻找将面向wpf的库移植到PCL库的选项,以便它可以在多个平台上使用,特别是Windows Store应用程序。

据我所知,可移植类库引用了。net库的一个子集,这些库在您的目标平台上是支持的,并且仅限于以下程序集:

  • mscorlib.dll
  • System.dll
  • System.Core.dll
  • System.Xml.dll
  • System.ComponentModel.Composition.dll
  • System.Net.dll
  • System.Runtime.Serialization.dll
  • System.ServiceModel.dll
  • System.Xml.Serialization.dll
  • System.Windows.dll (from Silverlight)

Microsoft在此基础上添加了以下内容:

然而,并非所有平台都支持所有这些程序集。在可移植类库项目中,您可以指定要使用的平台想要瞄准,并且只支持那些平台的程序集在您的项目中引用。如果您试图引用程序集不支持你所瞄准的平台,VisualStudio警告你不兼容。堆芯组件(mscorlib.dll、System.dll、System.Core.dll和System.Xml.dll)所有平台均支持

现在,当制作PCL库时,我得到的唯一引用是.NET Portable Subset,我不能添加任何引用;VS会告诉我所有可能的引用已经添加了。

现在我的问题很简单:何时确定的实际引用,以及确定这些?它是由编译器在编译时完成的,还是CLR在运行时完成的?

如何解决PCL引用

何时确定实际引用,

当然是在运行时,唯一可以发现你的代码实际上是在Silverlight上运行的时候。

,谁决定这些?

CLR。它将编译程序集中的可重定向程序集引用映射到机器上可用的具体程序集。重定向是CLR后续版本的通用功能,例如,你可以在。net 4.0程序中使用。net 2.0程序集。尽管它引用了mscorlib 2.0.0.0版本,但在4.0.0.0版本下运行

在PCL库中也是如此,它将针对mscorlib.dll的2.0.5.0版本,这个版本实际上并不存在。这个伪程序集引用是由编译程序所用的引用程序集产生的。它们存储在c:'program files (x86)'参考程序集中。编译器只知道这个版本是真实的。参考程序集有许多集,称为配置文件,它们被设计为只公开您希望在目标机器上使用的类型。当你开始一个PCL项目时,你选择目标,然后自动选择正确的配置文件,从一组参考程序集中选择一个集合,保证在你选择的任何目标上工作。选择的目标越多,可以在库代码中使用的类型就越少。

这种重定向当然只能针对"已知的"程序集,即CLR已经预先构建了如何映射的知识的程序集。这就是为什么不能添加任意框架程序集引用,因为CLR不可能在运行时将其映射到正确的框架程序集引用。最重要的是,它在机器上实际可用的希望很小。