加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

win-universal-app – 编译UWP App时出错:“保留使用Windows命

发布时间:2020-12-14 04:07:26 所属栏目:Windows 来源:网络整理
导读:我正在为使用Speech API的 Windows 10创建一个UWP应用程序但是在编译时我遇到了一个奇怪的错误. 场景是这样的: 针对Windows 8.1的PCL项目(??当我创建项目时,我将Windows 10设置为目标,但Visual Studio降级到Windows 8.1,因为“它们支持相同的可移植API集”)
我正在为使用Speech API的 Windows 10创建一个UWP应用程序但是在编译时我遇到了一个奇怪的错误.

场景是这样的:

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

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

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

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

您不能在PCL中引用Windows.Foundation.UniversalApiContract.因为它是一个可移植的类库,所以它不能引用仅限Windows的库.要使用Windows API,您需要具有Windows通用类库或Windows通用运行时组件.

因为您希望将应用程序移植,所以您必须选择使用依赖注入的不同方法.

在可移植类库中,应该只是与平台无关的代码.因为Speech API绝对不是平台无关的(每个操作系统都有自己的实现,每个实现都非常不同),您需要在PCL中只有一个接口,然后在您的平台项目中提供实现.

它将如何运作?

让我们说为了简单起见,你只想使用语音合成(对于语音识别,解决方案是类似的).

首先,您将在PCL中创建一个ISpeechSynthesisService接口:

public interface ISpeechSynthesisService
{
    Task SynthesizeTextAsync( string text );
}

现在,您将在UWP项目中提供一个实现:

public class WindowsSpeechSynthesisService : ISpeechSynthesisService
{
    public Task SynthesizeTextAsync( string text )
    {
        //implementation
    }
}

因为您可能想在PCL项目中使用该服务(例如在ViewModel中,您现在将受益于使用依赖注入容器.大多数MVVM框架提供了开箱即用的功能(模板10,MvvmLight,MvvmCross,Prism,DI容器允许您注册给定接口的实现并创建它们的实例.因此在您的UWP项目中,您可以执行以下操作:

container.RegisterType<ISpeechSynthesisService,WindowsSpeechSynthesisService>();

然后你可以直接在PCL中获取实例,例如:

var speechService = container.GetInstance<ISpeechSynthesisService>();

或者您更愿意为ViewModel或其他服务使用构造函数注入:

public MyViewModel( ISpeechSynthesisService speechService )
{
    //...
}

正如我所提到的,对于大多数MVVM框架,您将“免费”获得这两种方法,因此您无需手动实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读