PCL参考如何解决?

时间:2014-03-24 09:49:12

标签: c# portable-class-library

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

据我所知,可移植类库引用了您所定位的平台支持的.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(来自Silverlight)

微软补充说:

  

但是,并非所有平台都支持所有这些程序集。   在可移植类库项目中,您可以指定平台   想要定位,只有这些平台支持的程序集   在您的项目中引用。如果您尝试引用程序集   对于您有针对性的平台,Visual不支持   Studio警告您不兼容。核心组件   (mscorlib.dll,System.dll,System.Core.dll和System.Xml.dll)是   支持所有平台。

现在,在创建PCL库时,我得到的唯一引用是.NET Portable Subset,我无法添加任何引用; VS会告诉我已经添加了所有可能的参考文献。

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

1 个答案:

答案 0 :(得分:9)

  

何时确定实际参考文献,

当然,在运行时,唯一可以发现代码实际运行的时间,例如Silverlight。

  

谁决定这些?

CLR。它将编译后的程序集中的 retargetable 程序集引用映射到计算机上可用的具体程序集。重定向是后续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)\ reference程序集中。编译器并不比版本真实更好。有许多多个参考程序集,称为概要文件,旨在仅公开您希望在目标计算机上使用的类型。当您启动PCL项目时,您选择目标并自动选择正确的配置文件,一组参考程序集中的一个集合可以保证对您选择的任何目标起作用。您选择的目标越多,您在库代码中可以使用的类型就越少。

这种重新定位当然只能针对"已知"程序集,CLR预先建立了有关如何映射的知识。这就是为什么你不能添加一个任意的框架程序集引用,没有希望CLR在运行时将它映射到正确的框架程序集。最重要的是,它几乎没有希望它可以在机器上实现。