编译UWP App时出错:“保留使用Windows命名空间。”

时间:2016-09-08 01:00:48

标签: win-universal-app uwp windows-10-universal

我正在为使用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,它似乎可以工作,但我不喜欢它,因为我更喜欢在其他库项目中使用应用程序逻辑,以防我将应用程序移植到其他平台。 / p>

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

2 个答案:

答案 0 :(得分:7)

您无法在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 )
{
    //...
}

正如我所提到的,你将获得这两种方法&#34;免费&#34;对于大多数MVVM框架,所以您不需要手动实现它。

答案 1 :(得分:0)

这些错误让我疯狂,因为失败的库是由VS自动添加的,没有我注意到。一旦我意识到这一点,解决方案很容易。

  1. 删除相关引用(在您的情况下为Windows.Foundation.UniversalApiContract,但错误也可能发生在不同的库中,例如我的Windows.Phone.PhoneContract)。
  2. 关闭Visual Studio
  3. 从项目目录中删除binobj文件夹
  4. 打开项目
  5. 执行清洁
  6. 找到您刚删除的库的替代品(如有必要)
  7. 重建,你应该找到