3

VisualStudio2012を使用して.NETFramework4.0をターゲットにし、4.0環境(Windows Server 2003)に展開したときにコードが正しく機能することを確認する必要があります。

Visual Studio 2012のマルチターゲティングは正しく機能しているようですが、mscorlib.dll。他のフレームワークDLLを参照する場合、コンパイルの場合、たとえば4.0には存在しないタイプを参照するなどの適切なエラーが発生しますが、実行およびデバッグ中に4.5バージョンのDLLがロードされます。

これにより、4.5バージョンのフレームワークが行ったインプレースアップグレードの重大な変更を考慮して、コードが本番環境で正しく機能することを確認できなくなります。

MSDNにある4.0と4.5の違いのいくつかを実行することにより、マルチターゲティング機能をテストするためにいくつかの単体テストを行いました。テストは、テストしているフレームワークのバージョンを対象とした独自のプロジェクトに含まれています。すべてのテストに合格する必要があります。

MSCORLIBに対するテスト

List<string>これらのテストは、次の場所にあるように正常に合格しmscorlib.dllます。

フレームワーク4.0:-パス-

[TestMethod]
public void List_Foreach_should_not_throw_if_list_is_modified() {
    var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };

    list.ForEach((s) => {
        if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
            list.Add(".");
        }
    });
}

フレームワーク4.5:-パス-

[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void List_Foreach_should_throw_if_list_is_modified() {
    var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };

    list.ForEach((s) => {
        if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
            list.Add(".");
        }
    });
}

他のフレームワークDLLに対してテストします

ただし、これらのタイプはで検出され、4.5バージョンが常にロードされるため、これらのテストは正しく機能しません(4.5のものは合格し、4.0のものは合格しません)System.ComponentModel.Composition.dll

フレームワーク4.0-失敗し、4.5で予期される例外をスローします-

[TestMethod]
public void Should_be_able_to_create_a_serializer_for_MEF_catalogs()
{
    var catalog = new AggregateCatalog();
    var serializer = new XmlSerializer(typeof(AggregateCatalog));
}

フレームワーク4.5-パス-

[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void Should_not_be_able_to_create_a_serializer_for_MEF_catalogs()
{
    var catalog = new AggregateCatalog();
    var serializer = new XmlSerializer(typeof(AggregateCatalog));
}

これは設計どおりですか?4.0バージョンのmscorlibがロードされているが、他のすべてのアセンブリの4.5バージョンがロードされていることを考えると、互いに素であるように見えます。

希望する機能を取得する方法はありますか?

アップデート

これが私が使用しているソリューション/プロジェクトです。

4

2 に答える 2

2

私が理解しているように、それはまさにそれがどのように機能するかです。お使いのコンピューターと GAC に .NET 4.0 がありません。.NET 4.5 はインプレース アップグレードであるため、実行時には常に .NET 4.5 が使用されます (.NET 4.5 をインストールすると .NET 4.0 が上書きされます)。参照アセンブリとマルチ ターゲットは、IntelliSense、オブジェクト ブラウザー、および MSBuild (一般的なデザイン タイム ツール) でのみ機能します。

于 2012-09-25T22:17:06.167 に答える
2

素晴らしいリプロありがとうございます!

プロジェクトを見ると、結果に影響を与えていることが 2 つあります。

1) 4.5 で実行されている 4.0 アプリケーションを検出すると、合理的な (つまり不自然ではない) アプリケーションの使用法から観察可能であると判断した場合に、古い 4.0 の動作を返すように API を「shim」して変更します。たとえば、List.ForEach のリストを変更する機能に依存していた 4.0 アプリケーションは、4.0 または 4.5 で実行されているかに関係なく、引き続き 4.0 の動作を確認します。4.5 アプリケーションでは、新しい動作が見られます。

合理的な使用法と見なすものを決定し、shim する API をガイドするために、互換性チームがあり、フレームワーク全体のすべての「重大な」変更を調べ、それを一連のルールとガイドラインと比較する責任があります。過去10年間で積み上げてきました。

添付したプロジェクトには、テストしているものが 5 つあります。

  • 4.5 の下の List.ForEach は、リストが変更されると InvalidOperationException をスローします。
  • 4.5 未満の Uri では、パス セグメントの末尾のドットが保持されるようになりました
  • 4.5 未満の Uri はもうエスケープしませんか? file:// ベースの URI で
  • 4.5 の下の Enumerable.Empty は、同じインスタンスを返すことを保証するようになりました (これはドキュメントで少し誤解を招くものです [私はバグを報告しました]。最初に 2 つの異なるインスタンスを返す可能性があるという動作は 4.0 にあったと思います)。 multi-proc'd マシン上の 2 つの異なるスレッドによって同時にアクセスされました)
  • MEF のカタログは、もはや XML シリアライズ可能ではありません

これらの動作のうち、最初の 3 つの動作は、4.0 アプリケーションの実行時に 4.5 で以前の動作を返すように調整されています。一方、最後の 2 つはシムされていません。これは、非常に不自然なアプリケーションの使用法が最後の 2 つの変更によって壊れる可能性があるためです。たとえば、MEF カタログの変更を取り上げます。理論的には、XML シリアライザーを使用してこれらの型をシリアル化できますが (これは意図的ではなく、XML シリアライザーのひどい動作です)、結果に対して何もできませんでした。有用なものにデシリアライズします。

そのページを修正して、4.0 アプリケーション用に調整された破壊的変更のリストを含めることができるかどうかを追跡中です。

2)私が遭遇した 2 番目の問題は、別の 4.5 ベースのテスト プロジェクトと同じ実行中に、4.0 テスト プロジェクトが誤って 4.5 として検出されることでした。これは、4.0 テストを単独で実行することで確認でき、3 つの shimed テストがパスします。それらを 4.5 テストと一緒に実行すると、失敗します。この問題がどこで発生するのかはわかりませんが、内部でバグを報告し、責任あるチームとスレッドを開始して、その真相を突き止めました。外部で問題を追跡したい場合は、http://connect.microsoft.com/VisualStudioでお気軽にバグを報告してください。適切な所有者に転送されます。

デビッド・キーン

CLRチーム

于 2012-09-26T02:10:15.463 に答える