2

背景

我正在构建一个可在 Windows 8(作为商店应用程序)和 Windows 7(作为 WPF 桌面应用程序)上使用的应用程序。这些应用程序将允许浏览一堆(大约 500 多个应用程序“页面”)的内容。

虽然我不能在他们之间共享很多代码,但我确实希望尽可能多地共享。因此,我创建了一个针对 .NET 4.5、Silverlight 4+ 和 Windows 8 的便携式代码库 (PCL)。由于 Win 8 应用程序是用 JavaScript 编写的(出于各种原因,不是这个问题的一部分),我也有一个 Windows运行时组件,充当 JavaScript 和 PCL 之间的代理。换句话说,来自 JavaScript 的异步调用首先调用 WinRT 组件上的方法,然后调用 PCL 中的相应方法。

问题

为了支持 PCL 中的异步操作,我通过 NuGet 安装了 Microsoft.Bcl 和 Microsoft.Bcl.Async 包。这些,除其他外,定义了异步方法所需的 Task 和 Task<> 类,但它们在自己的程序集中这样做。WinRT 组件不需要这些库,因为已经为它定义了 Task 和 Task<>。问题是当我在 WinRT 组件中添加代码以调用返回 Task<> 对象的 PCL 中的 Async 方法时,我收到以下构建错误:

WINMDEXP:错误 WME1007:无法解析引用“程序集(名称=System.Threading.Tasks,版本=1.5.11.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a)”。

我试过的

我已经尝试了很多东西,但可能出现的主要两个是:

  1. 修改 WinRT 组件的 app.Config 以为程序集添加 bindingRedirect。
  2. 通过从内部执行的异步调用中取回 Task 对象并在其上调用 Wait(),使 PCL 调用在外部非异步。等待永远不会返回抛出一个神秘的异常。

那么,关于如何实现这一点的任何想法?

谢谢,
戴夫帕克

4

2 回答 2

0

这是 WinMDExp 的一个已知问题,已在 Visual Studio 2013 中修复。

我们在此页面上提供了一种解决方法(参见第 7 期):http: //blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx

于 2013-07-30T16:00:46.700 回答
-1

Windows 运行时组件是面向 Windows 运行时子集的特殊类型的项目,可用于以 JavaScript、C# 和 C++ 编写的 Windows 应用商店应用。并且它们还要求其中包含特定类型的类和属性,例如要密封的所有公共类,没有公共字段,没有返回任务的公共方法,只有 IAsyncAction 或 IAsyncOperation ...
您可以在其中引用您的可移植类库,但有一些限制。

已编辑:要解决您的问题,您不能在 Windows 运行时组件中返回任何非 WinRT 类型 - 您不能从可移植库返回任何类型,您必须创建包装器类型。
您也不能返回 Task 和 Task 类型,因为它们不是 WinRT 类型,但您可以创建包装方法并返回正确的等待类型,如下所示:

public IAsyncAction DoActionAsync()
{
    return DoAsync().AsAsyncAction();
}

internal async Task DoAsync()
{
}

public IAsyncOperation<int> DoIntOperationAsync()
{
    return DoIntAsync().AsAsyncOperation();
}

internal async Task<int> DoIntAsync()
{
    return 42;
}
于 2012-11-30T19:02:52.557 回答