gpt4 book ai didi

win-universal-app - 编译 UWP 应用程序时出错 : "The use of the Windows namespace is reserved."

转载 作者:行者123 更新时间:2023-12-04 07:51:03 35 4
gpt4 key购买 nike

我正在为使用语音 API 的 Windows 10 创建一个 UWP 应用程序,但在编译时出现了一个奇怪的错误。

场景是这样的:

  • 针对 Windows 8.1 的 PCL 项目(当我创建项目时,我将 Windows 10 设置为目标,但 Visual Studio 降级到 Windows 8.1,因为“它们支持同一组可移植 API”)并引用“Windows.Foundation.UniversalApiContract”因为它包含语音 API(Windows.Media.SpeechRecognition 和 Windows.Media.SpeechSynthesis)。
  • 引用 PCL 项目的 UWP 应用程序。 UWP 不使用语音 API,我只在 PCL 项目中使用它。

  • PCL 项目已成功构建,但是当我构建 UWP 项目时,出现很多错误,例如“.winmd 文件 'Windows.Foundation.UniversalApiContract.winmd' 包含类型 'XXXXX'。保留使用 Windows 命名空间。”我认为错误是由 PCL 项目的引用引起的。

    我尝试直接从 UWP 应用程序调用语音 API,它似乎可以工作,但我不喜欢它,因为我更喜欢将应用程序逻辑放在其他库项目中,以防万一我将应用程序移植到其他平台。

    我不知道该怎么办。如果 PCL 面向 Windows 8.1,我必须能够使用语音 API 而无需像 UWP 项目中那样添加引用,不是吗?是否有任何解决方法强制 PCL 仅针对 Windows 10?我错了,我应该使用其他项目类型而不是 PCL?

    最佳答案

    您不能在 PCL 中引用 Windows.Foundation.UniversalApiContract。因为它是一个可移植的类库,所以它不能引用仅限 Windows 的库。要使用 Windows API,您需要有一个 Windows 通用类库或一个 Windows 通用运行时组件。
    因为您希望应用程序可移植,所以您必须选择使用依赖注入(inject)的不同方法。
    可移植类库中应该只有平台无关代码 。因为语音 API 绝对不是平台无关的(每个操作系统都有自己的实现,并且每个实现都非常不同),所以您只需要在 PCL 中有一个 接口(interface),然后在您的平台项目中提供实现
    它将如何运作?
    为简单起见,假设您只想使用语音合成(对于语音识别,解决方案类似)。
    首先,您将在 PCL 中创建一个 ISpeechSynthesisService 接口(interface):

    public interface ISpeechSynthesisService
    {
    Task SynthesizeTextAsync( string text );
    }
    现在,您将在 UWP 项目中提供一个实现:
    public class WindowsSpeechSynthesisService : ISpeechSynthesisService
    {
    public Task SynthesizeTextAsync( string text )
    {
    //implementation
    }
    }
    因为您可能想在 PCL 项目中使用该服务(例如在 ViewModel 中,您现在将受益于使用 依赖注入(inject) 容器。大多数 MVVM 框架提供了开箱即用的 (模板 10,MvvmLight, MvvmCross、Prism 等)。DI 容器允许您为给定接口(interface) 注册实现 并创建它们的实例。因此,在您的 UWP 项目中,您可以执行以下操作:
    container.RegisterType<ISpeechSynthesisService, WindowsSpeechSynthesisService>();
    然后您可以 直接在 PCL 中获取实例 ,例如:
    var speechService = container.GetInstance<ISpeechSynthesisService>();
    或者您宁愿为您的 ViewModel 或其他服务使用 构造函数注入(inject) :
    public MyViewModel( ISpeechSynthesisService speechService )
    {
    //...
    }
    正如我所提到的,您将在大多数 MVVM 框架中“免费”获得这两种方法,因此您无需手动实现。

    关于win-universal-app - 编译 UWP 应用程序时出错 : "The use of the Windows namespace is reserved.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381071/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com