3

安装 studio 2012 后,构建一个针对 framework 4.0 的应用程序。我收到错误消息:

Type 'System.Threading.Tasks.Task' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with ....

我已经使用 svcutil 重新生成了服务引用。有没有办法指定所有异步的东西都从引用中排除?

?

4

2 回答 2

3

据我所知,您不能在 .NET 4.0 上使用基于 WCF 任务的异步模式(可以,但需要安装Async Targeting Pack for Visual Studio 2012),您需要升级到 .NET 4.5 才能使其正常工作。

我怀疑您在 Visual Studo 2010 上使用了某种扩展(如AsynCTP )。

在这里,您可以看到每个框架版本都支持哪些异步模式:

于 2013-01-03T14:02:28.713 回答
2

我不明白为什么,但似乎在某些构建环境中,您需要/syncOnly在升级到 Visual Studio 2012 后为您的服务生成接口的 svcutil 命令行添加一个开关。奇怪的是,如果我构建并运行在我的桌面上本地使用 Visual Studio 2012,我将所有异步方法添加到界面中,并且一切运行正常。但是,如果我在我们单独的构建机器上构建并在第三台机器上运行,那么我会遇到您所描述的错误。当我按照http://www.aspdotnethelp.com/a/d/type-system-threading-tasks-task1system-string-cannot-be-serialized-error-in-/syncOnly中的描述添加到命令行时,错误消失了wcf-236.aspx

这会导致不生成异步接口成员。

我还看到包含异步方法会导致不同的错误:

标有 IsOneWay=true 的操作不得声明输出参数、引用参数或返回值。

我怀疑原因在于使用 .NET 4.5 工具构建 .NET 4.0 应用程序。由于这些工具正在生成代码而不是编译代码,因此它们所针对的 .NET 版本不会在输出中强制执行。然后,当您在面向 .NET 4.0 的应用程序中使用面向 .NET 4.5 的代码时,某些行为会不同步。

于 2013-09-04T19:16:44.777 回答