MSBuild не находит асинхронные ссылки - PullRequest
6 голосов
/ 07 марта 2012

У нас установлены Visual Studio 2010 с пакетом обновления 1 (SP1) и Async CTP (обновление с пакетом обновления 1).

Решение с проектами, использующими ключевые слова async/await, работает нормально при сборке из VS IDE.Также при сборке с 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 ]

4 голосов
/ 08 марта 2012

Пожалуйста, обратитесь к обсуждению здесь: http://social.msdn.microsoft.com/Forums/uk-UA/async/thread/3d491cb0-a19f-4faf-80a6-5fd05e4e06db

Есть два момента, которые необходимо уточнить, чтобы лучше понять вашу проблему:

  • Среда: вы установили VS11бок о бок с VS 2010 + Async CTP?
  • Ваш проект: у вас есть XAML с пользовательскими элементами управления и "clr-namespace" в вашем проекте?

Я процитируюпредварительное заключение SERware из обсуждения на форуме MS:

Я думаю, что это связано с порядком, в котором проекты XAML компилируют сборки при обращении к классамсама библиотека.В этом случае загрузчик XAML пытается скомпилировать эти классы, прежде чем ссылаться на библиотеку Async CTP.Итак, ключевое слово «async» не распознается.

Лично я собираюсь посмотреть, возможно ли разделить сборку, чтобы разрешить порядок компиляции зависимостей в XAML

Добавлено после дальнейшего изучения: Как я выяснил, объяснение еще более разочаровывает: .NET 4.5 (бета-версия) заменяет .NET 4.0.Кроме того, подписи типов, связанных с асинхронностью / ожиданием, были внутренне изменены.Поэтому пока нет возможности одновременно использовать VS 2010 + AsyncATP и VS11 Beta.- Юрий С. 2 минуты назад

0 голосов
/ 19 сентября 2012

Я сам пострадал от этого, и по разным причинам я не могу обновить проекты до .NET 4.5, поэтому мне пришлось разработать обходной путь.

Поскольку это проблема только для проектов XAML, имеющихxmlns объявление, указывающее на себя. Я могу использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...