编译 UWP 应用程序时出错:“Windows 命名空间的使用被保留。”

Posted

技术标签:

【中文标题】编译 UWP 应用程序时出错:“Windows 命名空间的使用被保留。”【英文标题】:Error compiling UWP App: "The use of the Windows namespace is reserved." 【发布时间】:2017-01-15 19:17:50 【问题描述】:

我正在为使用语音 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?

【问题讨论】:

【参考方案1】:

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

因为您希望应用可移植,您必须选择不同的依赖注入方法。

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

它将如何运作?

为了简单起见,假设您只想使用语音合成(对于语音识别,解决方案类似)。

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

public interface ISpeechSynthesisService

    Task SynthesizeTextAsync( string text );

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

public class WindowsSpeechSynthesisService : ISpeechSynthesisService

    public Task SynthesizeTextAsync( string text )
    
        //implementation
    

因为您可能希望在 PCL 项目中使用该服务(例如在 ViewModel 中,您现在将受益于使用 Dependency Injection 容器。大多数 MVVM 框架都提供此功能框(模板 10、MvvmLight、MvvmCross、Prism 等)。DI 容器允许您注册给定接口的实现并创建它们的实例。所以在您的 UWP 中项目你做类似的事情:

container.RegisterType<ISpeechSynthesisService, WindowsSpeechSynthesisService>();

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

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

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

public MyViewModel( ISpeechSynthesisService speechService )

    //...

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

【讨论】:

很好的答案!非常感谢! 感谢您的回答帮助我找到了类似的问题。我想知道为什么 VS 允许成功构建 PCL。我以为错误会被编译器捕捉到。 谢谢,这帮助我解决了我的问题。我还在我的 PCL 中引用了 Windows.winmd。【参考方案2】:

这些错误让我发疯了,因为失败的库是 VS 自动添加的,我没有注意到。一旦我弄清楚了,解决问题就很容易了。

    删除有问题的引用(在您的情况下为 Windows.Foundation.UniversalApiContract,但不同的库也可能出现错误,例如在我的情况下为 Windows.Phone.PhoneContract)。 关闭 Visual Studio 从您的项目目录中删除 binobj 文件夹 打开项目 执行清理 为刚刚删除的库找到一个替代品(如有必要) 重建,你应该会被发现

【讨论】:

以上是关于编译 UWP 应用程序时出错:“Windows 命名空间的使用被保留。”的主要内容,如果未能解决你的问题,请参考以下文章

UWP ExtendedExecution - 请求扩展执行时出错

为 uwp 创建包时出错

Microsoft Band 2 + UWP + 后台任务 => 尝试获取蓝牙设备服务时出错

UWP:请求启动后台任务时出错

UWP: 掌握编译型绑定 x:Bind

UWP: 掌握编译型绑定 x:Bind