【问题标题】:Is Universal Windows Platform required to use the Windows.Devices.Bluetooth namespace?是否需要通用 Windows 平台才能使用 Windows.Devices.Bluetooth 命名空间?
【发布时间】:2019-04-15 12:40:03
【问题描述】:

我正在评估将 Windows 中的蓝牙低功耗 API 用于现有 WPF 应用程序的可行性。

我注意到在 Windows.Devices.Bluetooth 命名空间的文档中到处都提到了 UWP。我尝试创建一个 .NET 控制台应用程序,但不知道如何引入这个库。

如果我创建一个 UWP 控制台应用程序并将最小和最大版本都修复为 1803,那么我可以使用这个命名空间而不会打嗝。

我想知道是否需要 UWP 才能使用此命名空间。如果需要 UWP,我的计划 B 是以其他方式与低能耗蓝牙设备交互,但我似乎在 NuGet 上也找不到不是 UWP 的库。有替代品吗?我们的最终用户使用的是 Windows 10 平板电脑,但我们现有的应用程序是 WPF。

【问题讨论】:

  • 不,您不需要切换到 UWP。您必须在 WPF 应用程序中使用 WinRT 才能访问 BLE 功能。或者您可以使用Bluetooth Framework。它支持 WPF 并提供 Windows 平台上可用的所有 BLE 功能。

标签: c# wpf uwp bluetooth bluetooth-lowenergy


【解决方案1】:

[2018/11/16 更新]

感谢@Adam Braden - MSFT 改进了我的回复。是的,您可以从您的桌面应用程序调用Windows.Devices.Bluetooth API。

您需要添加对C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmdC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll 的引用。

请参阅此博客Calling Windows 10 APIs From a Desktop Application 了解更多信息。

请注意,如果您想从桌面应用调用 UWP API,您首先需要确认它是否在经典桌面应用中受支持。请参阅 UWP APIs callable from a classic desktop app 了解如何确定 API 是否在桌面应用中可用。

【讨论】:

  • 总而言之,是的,您可以在 Winforms 或 WPF 应用程序中使用 Windows.Devices.Bluetooth api。 VS 并不容易,您需要添加对 Windows.WinMD 的引用,这是用于调用 Windows API 的元数据。要支持 Async() 调用和互操作所需的其他一些类型,您还需要添加对 System.Runtime.WindowsRuntime.dll 的引用。上面引用的文章更详细。
  • 我在这个命名空间中的某些调用中遇到了 PlatformNotSupported 异常,这使我无法继续前进。抱怨平台不支持 WinRT。
【解决方案2】:

在 .Net 5 中,Microsoft 删除了对使用 WinRT API 的内置支持:

以前,CoreCLR 可以使用 Windows 元数据 (WinMD) 文件来激活和使用 WinRT 类型。从 .NET 5 开始,CoreCLR 不能再直接使用 WinMD 文件。

如果您尝试引用不受支持的程序集,您将收到 FileNotFoundException。如果你激活一个 WinRT 类,你会得到一个 PlatformNotSupportedException。

但是,有一个推荐的解决方案,那就是更改目标框架名字对象 (TFM)。例如,在您的项目文件中(假设您的目标是 .Net 5):

<!-- Change from -->

<TargetFramework>net5</TargetFramework>

<!-- To -->    

<TargetFramework>net5.0-windows10.0.19041</TargetFramework>

这将提供对 API 的访问(尽管特定 API 仍有一些例外)。

在撰写本文时,可用的 TFM 是:

将 TargetFramework 元素的值替换为以下字符串之一:

  • net5.0-windows10.0.17763.0:如果您的应用面向 Windows 10 版本 1809,请使用此值。
  • net5.0-windows10.0.18362.0:如果您的应用面向 Windows 10 版本 1903,请使用此值。
  • net5.0-windows10.0.19041.0:如果您的应用面向 Windows 10 版本 2004,请使用此值。

有关详细信息,您可以查看 Microsoft 的 Built-in support for WinRT is removed from .NET 网页,有关可用选项的详细说明,请参阅 Call Windows Runtime APIs in desktop apps 网页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2010-12-12
    • 2014-03-09
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多