9

最近、.NET 4.5 の機能を利用する新しいプロジェクトをサポートできるように、継続的インテグレーション ビルド サーバーに .NET 4.5 をインストールしました。このビルド サーバーは、古いプロジェクトのビルドとデプロイにも使用され、その一部は .NET 4.0 を対象としています。

このサーバー上で構築されている .NET 4.0 を対象とするプロジェクトを、.NET 4.0 のみがインストールされている対象サーバーに展開すると、次のエラーで失敗するようになりました。

Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

Environment.CurrentManagedThreadId は .NET Framework 4.5 の新しいプロパティであるため、4.0 を実行しているサーバーがそれを見つけられないのは理にかなっています。ただし、ビルド時に .NET 4.0 をターゲットにしているため、理論は運用サーバーに 4.5 をインストールする必要はありません。

総括する:

  • プロジェクトの目標 4.0
  • ビルド サーバーに 4.5 がインストールされている
  • プロジェクトがデプロイされるサーバーには、.NET 4.0 しかありません。
  • プロジェクトが実行時にエラーで失敗するMethod not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

何を与える?.NET 4.5 を使用するサーバーによって .NET 4.0 dll がビルドされている場合、.NET 4.0 のみがインストールされているサーバーで .NET 4.0 dll を正常に実行できますか?

4

1 に答える 1

12

これは、4.5 が 4.0 へのインプレース アップグレードであるためです。ビルド サーバーがコンパイルすると、既定では、.NET 4 をターゲットにしている場合でも、4.5 アセンブリが検出されます。

これを修正することはできますが、.NET 4.5 バージョンに依存するだけでなく、ビルド サーバーに 4.0 参照アセンブリを追加する必要があります (コンパイラが検出できるようにするため)。

詳細については、件名に関する Marc Gravell のブログ投稿を参照してください。

于 2013-02-12T21:25:44.567 に答える