1

C#で記述された.NETFramework3.5を使用した.NETアプリケーションがあります。アプリケーションは、BeginInvokeを使用して非同期的にデリゲートを呼び出しています。アプリケーションは、Visual Studio 2012 RCを使用してコンパイルすると正常に動作しますが、Visual Studio 2010 SP1を使用してコンパイルするとフリーズします(メインスレッドは、非同期デリゲートが完了するのを待ってWaitOneでスタックしますが、実行されません)。

バグが誤って設計された同期にある可能性はありますが、私が驚いたのは、両方で同じフレームワークバージョンをターゲットにしているのに、VS 2012で機能し、VS2010では機能しない理由です。

Visual Studio for .NETでマルチターゲティングはどのように実装されますか?同じフレームワークバージョンを対象とする場合、実行可能ファイルの動作が同じであると期待する必要がありますか、それとも、使用するVisual Studioのバージョンに依存する部分(コンパイラフロントエンドまたはランタイムライブラリの一部)がありますか?

4

1 に答える 1

2

はい、違いがあります。使用されるC#コンパイラは異なります。.NET 2.0をターゲットとするVS2008を参照してください。C#3の機能の使用が妨げられることはありません。注:これは、マルチターゲティングがVisual C ++で機能する方法とは異なります。この場合、古いバージョンのツールチェーン全体がターゲティング時に使用されます。

私を襲った問題は、foreach変数のライフタイムスコープが異なることでした。私はデリゲートで変数をキャプチャしていましたが、VS 2012では各デリゲートが独自のバージョンの変数をキャプチャしましたが、VS2010ではキャプチャしませんでした。

VS 2012は、新しい動作を実装するC#5コンパイラを使用しています。この変更は、Visual Studio 2012RCのVisualC#BreakingChangesに記載されています。また、C#5のその他の新機能についても説明されています。または、ForEachをリフティングし、VisualStudio2012で変更を壊します。

于 2012-07-11T09:14:57.753 に答える