2012-03-07 21 views
6

Tenemos instalados Visual Studio 2010 SP1 y Async CTP (actualización de SP1).MSBuild no encuentra las referencias requeridas async

Una solución con proyectos que usan async/await construcciones de palabras clave OK cuando se compila desde VS IDE. También cuando está construido con devenv /build "Debug" solution.sln todo está bien.

Sin embargo msbuild @commands.rsp solution.sln informes:

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 se ve así:

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

alguna pista?

+0

¿Puedes publicar tus comandos.rsp? – KMoraz

Respuesta

4

Usen la discusión aquí: http://social.msdn.microsoft.com/Forums/uk-UA/async/thread/3d491cb0-a19f-4faf-80a6-5fd05e4e06db

Hay 2 puntos por aclarar con el fin de comprender mejor su problema:

  • Medio Ambiente: ¿Desea instalar lado a lado VS11 con VS 2010 + Async CTP?
  • Su proyecto: ¿tiene XAML con controles de usuario y "clr-namespace" en su proyecto?

Voy a citar la conclusión preliminar de SERware de la discusión en el foro EM:

Creo que tiene que ver con el orden en que el XAML proyecta compilar asambleas cuando se hace referencia a clases de la biblioteca en sí. En este caso, el Cargador XAML intenta compilar estas clases antes de tener referencia a la biblioteca Async CTP. Por lo tanto, la palabra clave "async" no es reconocida.

Personalmente voy a ver si es posible dividir la asamblea con el fin de resolver el orden de la compilación de las dependencias en XAML

Alta después de una investigación adicional: Como he descubierto, la explicación es aún más decepcionante: .NET 4.5 (Beta) reemplaza a .NET 4.0. Además, las firmas de los tipos relacionados asincr/wait han sido modificados internamente. Por lo tanto, no hay manera de utilizar simultáneamente VS 2010 + AsyncATP y VS11 Beta. - Yuri S. Hace 2 minutos

+0

Primer punto, sí, tengo VS11 instalado. Sin embargo, mi compañero de trabajo no, y él recibió los mismos errores. En el segundo punto, todas las llamadas asincrónicas/esperadas en nuestro caso están en ViewModel, por lo que no tienen una contraparte xaml (mi ejemplo de error es engañoso porque de todos modos no tenía el nuestro en scrollback y ese fue el que tenía misma descripción de error y código) –

+0

Como he descubierto, la explicación es aún más decepcionante: .NET 4.5 (Beta) reemplaza .NET 4.0 Además, las firmas de los tipos relacionados async/wait han sido modificados internamente . Por lo tanto, no hay manera de usar simultáneamente VS 2010 + AsyncATP y VS2011 Beta. –

0

Me impactó esto y por diversas razones no puedo actualizar los proyectos a .NET 4.5, así que tuve que desarrollar una solución alternativa.

Dado que esto es solo un problema para los proyectos XAML que tienen una declaración xmlns señalando a sí mismos, puedo usar async en todos los otros proyectos a los que se hace referencia. Esto significa que mi arquitectura todavía está utilizando async/await y está preparada para el paso a .NET 4.5 más adelante.

Pero en los proyectos XAML afectados, simplemente implemento manualmente (mal) lo que el compilador espera.

Así código que era este limpio antes:

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); 
} 

Ahora se convierte en esto:

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); 
     } 
    }); 

No es ideal, por supuesto, y esto es exactamente lo que async/await sido creados con fines resolver. Pero funciona como una solución temporal a corto plazo, al menos para usos simples de await.

Cuestiones relacionadas