2012-03-07 18 views
6

Visual Studio 2010 SP1とAsync CTP(SP1リフレッシュ)がインストールされています。MSBuildで非同期要求参照が見つかりません

async/awaitキーワードを使用するプロジェクトのソリューションは、VS IDEからビルドするとOKです。 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 

任意の手がかり?

+0

commands.rspを投稿できますか? – KMoraz

答えて

4

、ここでの議論を参照してください:

私は、MSのフォーラムでの議論からSERwareによる予備結論引用します:私はそれが参照したときにXAMLが コンパイルアセンブリを投影した順番に関係していると思います

をライブラリ自体のクラス。 このケースでは、XAMLローダーはこのクラスをコンパイルしてから、非同期CTPライブラリへの参照を にします。したがって、キーワード「async」は ではありません。個人的に私はさらなる調査の後に追加されましたXAML

で依存関係のコンパイルの順番を解決するためにアセンブリを分割することが可能であるかどうかを確認するつもりです

: 私が発見したとして、 .NET 4.5(Beta)は.NET 4.0に代わるものです。さらに、非同期/待機関連型のシグネチャは内部的に変更されています。したがって、これまでにVS 2010 + AsyncATPとVS11 Betaを同時に使用する方法はありません。 - Yuri S. 2分前

+0

最初の点は、はい私はVS11をインストールしています。しかし、私の同僚は、同じエラーを持っていません。 2番目の点では、私たちのケースでは、すべての非同期/待機待ちの呼び出しはViewModelにあるため、対応するxamlはありません(私のエラーの例では、スクロールバックに私たちのものがなかったので誤解を招きます。同じエラーの説明とコード) –

+0

私が知ったように、説明はさらに失望しています。 .NET 4.5(Beta)が.NET 4.0を置き換えます さらに、非同期/待機関連のシグネチャは内部的に変更されています。したがって、これまでにVS 2010 + AsyncATPとVS2011 Betaを同時に使用する方法はありません。 –

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の簡単な使用では、短期的な回避策として機能します。

関連する問題