Javascript 从windows运行时组件调用可移植代码库中的异步方法 出身背景

Javascript 从windows运行时组件调用可移植代码库中的异步方法 出身背景,javascript,windows-runtime,portable-class-library,winrt-async,Javascript,Windows Runtime,Portable Class Library,Winrt Async,我正在构建一个应用程序,它将作为商店应用程序在Windows 8上可用,作为WPF桌面应用程序在Windows 7上可用。这些应用程序将允许浏览500多个应用程序页面的内容 虽然我不能在他们之间共享很多代码,但我确实希望尽可能多地共享。因此,我创建了一个针对.NET4.5、Silverlight4+和Windows8的可移植代码库PCL。由于Win 8应用程序是基于各种原因(不是这个问题的一部分)用JavaScript编写的,因此我还有一个Windows运行时组件,它充当JavaScript和P

我正在构建一个应用程序,它将作为商店应用程序在Windows 8上可用,作为WPF桌面应用程序在Windows 7上可用。这些应用程序将允许浏览500多个应用程序页面的内容

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

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

WINMDEXP:错误WME1007:无法解析引用“AssemblyName=System.Threading.Tasks,Version=1.5.11.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”

我试过的 我尝试了很多方法,但可能出现的主要两种方法是:

修改WinRT组件的app.Config以添加程序集的bindingRedirect。 通过从内部执行的异步调用中获取任务对象并对其调用Wait,使PCL调用外部非异步。等待要么永不返回,要么抛出一个神秘的异常。 那么,关于如何实现这一点有什么想法吗

谢谢,
Dave Parker

< P> Windows运行时组件是针对Windows运行库的子集的特殊类型的项目,这些窗口可用于在JavaScript、C和C++中编写的Windows商店应用程序。它们还需要特定类型的类和属性,比如所有要密封的公共类,没有公共字段,没有返回任务的公共方法,只有IAsyncation或IAsyncOperation。。。 您可以在其中引用可移植类库,但有一些限制

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

公共IAsyncation DoActionAsync { 返回DoAsync.AsAsyncAction; } 内部异步任务DoAsync { } 公共IAsyncOperation DoIntOperationAsync { 返回DoIntAsync.asAsAsyncOperation; } 内部异步任务DoIntAsync { 返回42; }
<> Windows运行时组件是针对Windows运行时可用的子集的特定类型的项目,这些窗口应用程序是在JavaScript、C和C++中编写的Windows商店应用程序。它们还需要特定类型的类和属性,比如所有要密封的公共类,没有公共字段,没有返回任务的公共方法,只有IAsyncation或IAsyncOperation。。。 您可以在其中引用可移植类库,但有一些限制

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

公共IAsyncation DoActionAsync { 返回DoAsync.AsAsyncAction; } 内部异步任务DoAsync { } 公共IAsyncOperation DoIntOperationAsync { 返回DoIntAsync.asAsAsyncOperation; } 内部异步任务DoIntAsync { 返回42; }
这是WinMDExp的一个已知问题,已在Visual Studio 2013中修复


我们在此页面上提供了一个解决方法,请参见第7期:。

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


我们在本页提供了一个解决方法,请参见第7期:。

实际上,Windows运行时组件可以很好地引用PCL。我已经在这么做了。你是对的,你可以引用一些有限制的可移植库,但不是所有地方都可以。在后台任务中,您只能使用纯Windows运行时组件。要么我误解了您的回答,要么您误解了我的问题。我的问题不是从WRC返回,而是从WRC调用PCL中的异步方法。在PCL中,任务由CodePlex中的Microsoft.Bcl.*库实现。在WRC中,任务内置于.NET Framework的WinRT子集中。编译器无法将它们强制转换为任何公共基。此外,国际会计准则
在WINRT的WINDOWS .FAST命名空间部分中定义了yActudio和IasycCurn,因此不适用于PCL。如果您的回答以某种方式解决了这一问题,我看不到。嗯,您是对的,我已经复制了您的场景,看起来带有Microsoft.Bcl.Async的便携式Libs不能用于Windows运行时组件,但是:这可能是作为一个bug登录到Microsoft Connect站点上的。我已经在NuGet站点上向包所有者提交了一份联系表单。这似乎是联系包裹负责人最直接的方式。我在connect.microsoft.com上能找到的最接近的工具是Visual Studio和.NET Framework,这是我在该团队中工作过的一个非常大的团队。实际上Windows运行时组件可以很好地引用PCL。我已经在这么做了。你是对的,你可以引用一些有限制的可移植库,但不是所有地方都可以。在后台任务中,您只能使用纯Windows运行时组件。要么我误解了您的回答,要么您误解了我的问题。我的问题不是从WRC返回,而是从WRC调用PCL中的异步方法。在PCL中,任务由CodePlex中的Microsoft.Bcl.*库实现。在WRC中,任务内置于.NET Framework的WinRT子集中。编译器无法将它们强制转换为任何公共基。此外,在WINRT的WINDOWS .FAST命名空间部分中定义了IasyActudio和IasycCurm,因此不适用于PCL。如果您的回答以某种方式解决了这一问题,我看不到。嗯,您是对的,我已经复制了您的场景,看起来带有Microsoft.Bcl.Async的便携式Libs不能用于Windows运行时组件,但是:这可能是作为一个bug登录到Microsoft Connect站点上的。我已经在NuGet站点上向包所有者提交了一份联系表单。这似乎是联系包裹负责人最直接的方式。我在connect.microsoft.com上能找到的最接近的工具是Visual Studio和.NET Framework,这是我曾经在该团队中工作过的一个非常大的团队。