【问题标题】:Can I use PCL library in standard .Net application?我可以在标准 .Net 应用程序中使用 PCL 库吗?
【发布时间】:2016-11-25 07:29:57
【问题描述】:

我有 PCL 库,我想将它添加到标准 (.net 4.6) C# 控制台应用程序。只要我不使用库中的任何 PCL 特定类,一切都很好。如果我这样做了,我会收到一个错误“不支持的 PCL 配置文件”。此错误不可谷歌搜索。但是同一个库在 UWP 应用程序中运行良好。我正在寻找解决方案或官方解释为什么我不能在非 UWP 应用程序中使用 PCL。

【问题讨论】:

  • 您的 PCL 库针对哪个 PCL 配置文件?
  • @AndersGustafsson 我的目标是 Windows 8.1 和 Windows Phone 8.1。我将 .Net Framework 4.5.1 添加到 Alexej Sommer 指出的目标框架中,但它似乎使我的大多数命名空间不兼容(请参阅 Alexej 回答下方的评论)。
  • 您在下面列出的那些命名空间在 .NET 中可用。因此,如果您创建包含 .NET 的 PCL 库,它们也不会显示。对于要包含在 PCL 配置文件中的命名空间、类型或方法,它必须在 PCL 配置文件所针对的所有平台上可用。
  • 好的,谢谢。我错过了 PCL 只是一种限制机制的概念。似乎我将不得不重写库以与 .NET 框架兼容,或者我将不得不制作 Windows 8 或 UWP 应用程序,而不是 .NET 框架之一。真是一团糟。谢谢!

标签: c# uwp portable-class-library


【解决方案1】:

是的,你可以。 PCL 基本上是跨不同平台的可用 API 的交集。缺点是选择的目标平台越多,交叉点越小:

PCL 的另一个缺点是它为每个平台生成单独的程序集。

这就是 Microsoft 提供 .NET Standard 的原因 - 一种使用不同方法的 PCL 替代品。

将 .NET Standard 视为定义 API 集的接口。然后 .NET Framework、.NET Core、Xamarin.iOS、Xamarin.Android 等平台将实现 .NET Standard。

interface NetStandard1_0 {
}

interface NetStandard1_1 : NetStandard1_0{
}

interface NetStandard1_2 : NetStandard1_1{
}

net46: NetStandard1_6 {
}

dnxcode46: NetStandard1_6 {
}

因此,您不会针对特定平台,而是针对 .NET Standard 版本。当您的库以 .NET Standard 为目标时,它可以在任何实现 .NET 标准的平台中使用。另一个优点是您不再需要针对不同平台的单独程序集。将有一个程序集在任何地方运行。

但是,我建议您等到 2017 年 4 月发布 .NET Standard 2.0。微软承诺所有平台(.NET Framework、.NET Core、Xamarin.iOS、Xamarin.Android)都将支持此版本的.NET Standard,并将在 Visual Studio 中获得官方支持。此外,使用 project.json 的 Visual Studio 项目将转换为 .csproj,因此所有 Visual Studio 项目将使用相同的格式,这将解决很多兼容性问题。清理去年出现在 .NET 中的烂摊子是绝对必要的

【讨论】:

  • 感谢您提供有关 .Net Standard 的信息,我只是想知道它是什么。对于这个项目的未来,这似乎是一个很好的解决方案。
【解决方案2】:

当然可以。 只需将 .NET 4.6 添加到选定的平台:

它会在您创建 PCL 时出现。
更多信息在这里: Cross-Platform Development with the Portable Class Library

或者您可以更改现有 PCL 中的平台。只需转到属性页面,您就会看到:

这是一篇关于如何从桌面应用调用 UWP API 的好博文:
How to call UWP APIs from a desktop VB/C# app

【讨论】:

  • Alexej,谢谢,我认为是正确的。我的目标是 Windows 8.1 和 Windows Phone 8.1。正如您所指出的,我添加了 .Net Framework 4.5.1,但现在我的库构建失败 - 无法找到大多数命名空间,包括 Windows.Devices.Bluetooth.Rfcomm,Windows.Devices.Enumeration, Windows.Networking,Windows.Networking.Proximity, Windows.Networking.Sockets, Windows.Storage.Streams, Windows.ApplicationModel.Resources, Windows.Devices.GeolocationWindows 命名空间中的所有内容)。我错过了什么吗?或者我不能在 .Net Framework 4.5.2 中使用它们?如果我需要地理定位,我必须使用 UWP?
  • 您可以在您的 .NET 应用程序中使用System.Device.Location,但在这种情况下您应该重写所有代码。 .NET 中缺少 Windows 命名空间。我认为这可能是一种引用它的方式,但不建议这样做(我看过有关如何从 .NET 引用 winrt 的文章)啊,这里是 Using Windows 8 WinRT APIs in .NET Desktop Applications
  • 是的,我已经在another source 中看到了这个。看起来像一个肮脏的黑客,对我不起作用。无论如何感谢您的帮助!似乎必须重写 80% 的代码。幸运的是,当我尝试使这个 PCL COM 兼容时,我已经做到了(这导致将其重写为 .NET 4.5)。
猜你喜欢
  • 2018-11-28
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2019-07-17
相关资源
最近更新 更多