我正在为使用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框架,您将“免费”获得这两种方法,因此您无需手动实现.

win-universal-app – 编译UWP App时出错:“保留使用Windows命名空间.”的更多相关文章

  1. .net – 如何在PowerShell中引用UWP类

    我想使用通用Windows平台库中的数据类型,如何在PowerShell中引用包含的命名空间或程序集?

  2. win-universal-app – 编译UWP App时出错:“保留使用Windows命名空间.”

    我正在为使用SpeechAPI的Windows10创建一个UWP应用程序但是在编译时我遇到了一个奇怪的错误.场景是这样的:>针对Windows8.1的PCL项目(当我创建项目时,我将Windows10设置为目标,但VisualStudio降级到Windows8.1,因为“它们支持相同的可移植API集”)并且引用了“Windows.Foundation.UniversalApiContract“因为

  3. 如何等待WebViewBrush.Redraw()完成(UWP打印)?

    >现在为每个“页面”:>我将WebView的scrollY设置为仅使用JavaScript显示当前页面:window.scrollTo>然后我使用WebViewBrush捕获WebView中当前页面的快照>对所有剩余页面重复此操作…

  4. 在使用F#时,目前无法将UWP应用程序发布到Store吗?

    我知道有一个名为Desktopbridge的东西,但我不知道这是否可用于此上下文.如果目前无法使用F#将XF应用程序发布到Windows应用商店,那么有什么时候可以估算吗?

  5. windows-10 – 隐藏UWP中的状态栏

    我使用下面的代码来隐藏UWP中的状态栏.当我在计算机中以开发模式运行应用程序时,状态栏不会显示在WindowsPhone中.我在Windows应用商店中部署了应用,在下载应用后,我看到状态栏出现在我的应用中.这是我的代码:问题是,为什么上面的代码不适用于Windows应用商店?此外,我在Windows商店中有我的应用程序Applink的链接,但是当我在Windows商店中搜索确切的关键词时,我的应用程序没有显示在Windows商店中,但点击链接会在窗口商店中显示我的应用程序.谢谢!

  6. xaml – UWP的日历日期选择器

    我目前正在开发一个UWP应用程序,我在google,https://msdn.microsoft.com/en-us/windows/uwp/controls-and-patterns/calendar-date-picker中偶然发现了这个问题我目前正在使用日期选择器来选择日期,但我认为日历日期选择器更适合这个.我当时使用了日期选择器,因为我在工具箱中找不到日历日期选择器,我相信它不适用于UWP

  7. 代码覆盖 – 是否有适用于通用Windows软件包应用程序的代码覆盖率工具

    我正在为Win10构建通用Windows软件包应用程序,并希望为其完成代码覆盖,但VisualStudioEnterprise版本不支持Windows应用商店或WindowsPhone应用程序的代码覆盖率.是否有任何工具可以进行代码覆盖.Jetbrains的dotCover也不能与UWP合作不幸的是,答案是否定的–在VisualStudio2017中,UWP应用程序尚无代码覆盖支持.

  8. xaml – 覆盖主题画笔Windows 10 UWP

    我试图在Windows10中覆盖一些样式颜色,但我无法让它工作.我的app.xaml看起来像这样:而我的Theme.xaml看起来像这样但是它不起作用,它不会覆盖任何地方的风格.您设置的样式适用于Windows8应用程序.通用Windows应用程序使用的样式大大简化.找到它们的最简单的方法是将您的ListBox添加到页面,在设计器中右键单击它,然后选择编辑模板…

  9. win-universal-app – 构建错误的UWP应用程序Microsoft.Bcl.Build和packages.config旁边的项目文件

    它也不会阻止我在本地或其他方面部署和运行我的应用程序.看到这个列表是一个构建错误,当它不会打破构建时,这只是一个烦人的事情!

  10. .net – System.Serializable属性在Windows 10的UWP应用程序中出现?

    您需要使用以下属性:用类标记并标记属性要么例如:

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部