MSBuild找不到异步必需的引用

时间:2012-03-07 11:05:21

标签: visual-studio-2010 asynchronous msbuild

我们安装了Visual Studio 2010 SP1和Async CTP(SP1刷新)。

从VS IDE构建时,使用async/await关键字的项目的解决方案构建正常。 使用devenv /build "Debug" solution.sln构建时,一切正常。

然而msbuild @commands.rsp solution.sln报告:

File.xaml.cs(123): error CS1993: Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?

commands.rsp看起来像这样:

/nologo
/p:Configuration=Debug
/m:3
/fileLogger

任何线索?

2 个答案:

答案 0 :(得分:4)

请参阅此处的讨论:http://social.msdn.microsoft.com/Forums/uk-UA/async/thread/3d491cb0-a19f-4faf-80a6-5fd05e4e06db

为了更好地理解您的问题,有两点需要澄清:

  • 环境:您是否与VS 2010 + Async CTP并排安装VS11?
  • 您的项目:您的项目中是否有带用户控件和“clr-namespace”的XAML?

我将在MS论坛的讨论中引用 SERware 的初步结论:

  

我认为这与XAML项目的顺序有关   在引用库本身的类时编译程序集。在   在这种情况下,XAML Loader尝试在编译之前编译这些类   引用Async CTP库。因此,关键字“async”不是   识别。

就个人而言,我将看看是否可以拆分程序集以解决XAML中依赖项编译的顺序

进一步调查后补充: 正如我所知,解释更令人失望:.NET 4.5(Beta)取代了.NET 4.0。此外,异步/等待相关类型的签名已在内部更改。因此,目前还没有办法同时使用VS 2010 + AsyncATP和VS11 Beta。 - Yuri S. 2分钟前

答案 1 :(得分:0)

我自己受到了这种打击,由于种种原因,我无法将项目升级到.NET 4.5,所以我不得不开发一种解决方法。

由于这对于具有指向自身的xmlns声明的XAML项目来说只是一个问题,因此我可以在所引用的所有其他项目上使用async。这意味着我的架构仍在使用async / await,并准备好以后再迁移到.NET 4.5。

但是在受影响的XAML项目中,我只是手动实现(很差)等待编译器另外完成的事情。

所以之前的代码是干净的:

try
{    
    var foo = GetFoo();
    foo.DoStuff();
    var data = await foo.GetDataAsync();
    bar.WorkOnData(data);
}
catch (Exception ex)
{
    // Logging, throw up a popup, whatever...
    HandleError("Failed to get data", ex);
}

现在变成了这个:

var foo = GetFoo();
foo.DoStuff();
var getDataTask = foo.GetDataAsync();
getDataTask.ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            // Logging, throw up a popup, whatever...
            HandleError("Failed to get data", t.Exception);
            return;
        }
        if (t.Status == TaskStatus.RanToCompletion)
        {
            bar.WorkOnData(t.Result);
        }
     });

当然不理想,这就是async/await创建要解决的问题。但它确实可以作为短期解决方法,至少对于await的简单使用。