2

Windows 8 マシンの Visual Studio 2012 で開発された、非同期/待機サポートにMicrosoft.Bcl.Asyncを使用する .NET 4.0 アプリケーションがあります。私のマシンで問題なくビルドでき、他の環境 (XP/Vista/7) でも問題なく動作します。

私のビルド サーバーのセットアップは、Windows Server 2008 R2、.NET 4.5 がインストールされ、TeamCity です。

ビルド構成でソリューションのビルドに失敗し、次のエラーが表示されます。

GenerateTemporaryTargetAssembly 
GenerateTemporaryTargetAssembly 
Ferox.Local.Wpf\uf4edrwb.tmp_proj 
CoreCompile 
Csc 
MyClass.cs(8, 29): error CS0433: The type 'System.IProgress<T>' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll' and 'c:\TeamCity\buildAgent\work\80d9f16a33820be7\packages\Microsoft.Bcl.1.0.19\lib\net40\System.Runtime.dll'

ビルド構成は Visual Studio 2012 に設定されています。エージェントの要件を確認したところ、"DotNetFramework4.5_x86" への依存関係が含まれています。したがって、ここに記載されているように、.net 4.5 msbuild を使用する必要があります。

パッケージ (Microsoft.Bcl.Async、Microsoft.Bcl、Microsoft.Bcl.Build) を削除し、再度追加しました。変わりはない。

オプションが不足しています。何か案は?

編集

先ほど言ったように、TeamCity を設定しただけで、ビルド構成は非常に単純です。まず、svn からブランチをチェックアウトします。

ランナー タイプ「Visual Studio (sln)」のビルド ステップがあり、Visual Studio のバージョンは 2012、「ターゲット」フィールドは「クリーン、ビルド」、構成は「リリース」です。

さらに、「AssemblyInfo パッチャー」を使用してバージョン番号を更新します。

アップデート

Jon Skeet の提案に従い、ランナーの種類を MSBuild に変更しました。ランナー タイプ: MSBuild MSBuild バージョン: Microsoft .NET Framework 4.5 MSBuild ツールバージョン: なし 実行プラットフォーム: x86 ターゲット: クリーン、ビルド コマンド ライン パラメーター: /P:Configuration=Release

それでも同じエラーが発生します。

「MSBuild ToolsVersion」を「4.0」に変更しました (ソリューションは Visual Studio 2012 で作成されているため、必要はないと思いますが)。同じエラー。

「実行プラットフォーム」を「x64」に変更しました。同じエラー。

アップデート

私のサーバー マシンには、.NET 4.0 (および 4.0.3) の参照アセンブリがありませんでした。この投稿を見た後、それが原因かもしれないと思いました。そのことを念頭に置いて、参照アセンブリを開発者のコ​​ンピューターからサーバーにコピーしました。次に、もう一度ソリューションを構築しようとしました。同じエラー。あの時は本当に勝てると思ったのに…

アップデート

ビルドに影響を与える.NET4.5インストールからぶら下がっている更新があるかどうかを確認するために、サーバーを再起動しようとしました。同じエラー。

アップデート

Windows 7 および .NET 4 用の Windows SDK をサーバーにインストールしました。そしてついにビルド成功!ただし、Marc Gravell の投稿と Hans の回答に従って、参照アセンブリをコピーするだけでビルドが修正されるはずだと本当に思っていました。次に、「...\Reference Assemblies\」フォルダーを検索して、sdk のインストールによって他に何かが追加されたかどうかを確認しました。そして、自分の間違いに気づきました。参照アセンブリを「C:\Program Files (x86)\Reference」にコピーするのではなく、サーバーのフォルダー「C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework」にコピーしていました。 Assemblies\Microsoft\Framework.NETFramework" . したがって、ビルドはアセンブリを見つけることができませんでした。

4

1 に答える 1

2

「c:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll」の両方に存在します...

これは古い慣行であり、4.0 より前の .NET バージョンで行われていた方法です。参照アセンブリが Framework ディレクトリに格納されている場所。.NET 4.5 がインストールされていて、.NET 4.0 をターゲットとしてアセンブリをビルドしようとすると、これは致命的です4.5 での変更は大きすぎます。特に、async/await を機能させる配管に関してはそうです。他にも多くの微妙な問題があります。たとえば、ExtensionAttribute クラスが System.Core.dll から mscorlib.dll に移動されました。[TypeForwardedTo] 属性が隠すかなり控えめな変更。しかし、間違った参照アセンブリが使用されている場合はできません。

参照アセンブリは別の場所に保存されるようになりました。c:\program files\reference assembly にあるものを参照する必要があります。.NET フレームワークのバージョンごとに異なる参照アセンブリがあります。4.0 デスクトップ バージョンのものは、64 ビット マシンの C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0 にあります。

プログラマーがどうやってこのような窮地に陥るかは、私にはよくわかりません。何年も前に誕生したカスタム ビルド スクリプトと関係があるかもしれません。一般に、最初に試みることは、すべての .NET 参照を削除してから追加し直すことです。それでも問題が解決しない場合は、ビルド システムを詳しく調べてください。/reference コンパイラ オプションに問題があります。

于 2013-09-09T13:35:00.093 に答える