31

.NET 3.5 WinFormsベースのアプリケーションを最新の.NETバージョン(4.5)に移行したいと思います。

このアプリケーションは、現在.NET 3.5ベースでもある「外部」コンポーネント(プラグインと考えることができます)を使用します。

アプリケーションのみを.NET4.5を使用してコンパイルするように変換する場合に使用されるランタイム/コアライブラリを知りたいですか?

このシナリオは適切に機能する必要がありますか?(4.5プロセスで.NET 3.5アセンブリをロードする)?*プラグインアセンブリはリフレクションを介してロードされます。

CLRランタイムはそのようなシナリオをどのように処理しますか?これは安全な方法ですか?

4

3 に答える 3

24

アプリのメイン EXE を再コンパイルして .NET 4.x をターゲットにするか、要素を含む app.exe.config ファイルを使用し<supportedRuntime>て強制的に CLR バージョン 4 を使用するようにした場合、.NET 3.5 と .NET の両方を問題なく使用できます。 NET 4.0 アセンブリ。CLR v4 では、3.5 アセンブリの読み取りに問題はなく、下位互換性があります。その逆ではなく、CLR v2 はバージョン 4 のアセンブリを読み取ることができないため、EXE が v4 を対象としていない場合は .config ファイルが必要になります。

唯一の問題は、3.5 アセンブリが古いフレームワーク アセンブリに依存していることです。たとえば、mscorlib.dll のバージョン 2.0.0.0 を要求します。CLR はこれらの要求を自動的に変換し、バージョン 4.0.0.0 に置き換えます。これは一般的に問題なく動作し、標準の 4.0 フレームワーク アセンブリは古いバージョンと非常に互換性があります。

しかし、Microsoft は 4.0 を新しいサイド バイ サイド バージョンとしてこの機会を利用し、誤ってバグのある動作に依存したコードを壊す危険を冒さずに簡単に修正できなかった古いバグを修正しました。これらは非常にわかりにくいバグであり、これらのバグ修正があなたを苦しめる可能性はほとんどありません。ただし、確認のためにコードを再テストする必要があります。

于 2012-12-10T16:11:56.837 に答える
17

すべてのアセンブリは、アプリケーションが対象とする .NET Framework の型を使用します。

簡単なテストを次に示します。

次のクラスを持つ.NET Framework 2.0 クラス ライブラリであるプロジェクト ' Net2Library ' :

using System;
using System.Collections.Generic;

namespace Net2Library
{
    public class Class1
    {
        public static List<string> GetStrings()
        {
            var strings = new List<string>();
            Console.WriteLine("From Net2Library: {0}", strings.GetType().AssemblyQualifiedName);
            return strings;
        }
    }
}

プロジェクト ' Net4Application ' は、Net2Library.dll を参照し、次のクラスを持つ.NET Framework 4.0 コンソール アプリケーションです。

using System;
using Net2Library;

namespace Net4Application
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("From Net4Application: {0}", Class1.GetStrings().GetType().AssemblyQualifiedName);
        }
    }
}

コンソール出力は次のようになります。

Net2Library から: System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089 Net4Application から: System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken =b77a5c561934e089

次のリソースも確認できます: .NET Framework Assembly Unification OverviewおよびAssembly Binding Redirection

于 2012-12-10T16:45:20.057 に答える
7

4.5 実行可能ファイルから参照される 3.5 アセンブリがある場合、両方のアセンブリが 4.5 の CLR 環境で実行されます。ただし、3.5 アセンブリは、v4.0 ではなく v3.5 ライブラリをターゲットにします (ただし、4.0 ライブラリは 3.5 と同じ機能をすべて備えています)。

したがって、少なくとも私の経験では、2.0 ~ 3.5 を対象とするアセンブリと 4.0 ~ 4.5 を対象とするその他のアセンブリが必要な場合は、クライアント コンピューターに 3.5 と 4.5 の両方のフレームワーク バージョンをインストールする必要があります。3.5 は 2.0 と完全に下位互換性があるため、3.5、3.0、および 2.0 をすべて 1 つの環境で実行できます。4.0-4.5 はほとんどの古いコードと互換性がありますが、破壊的な変更がいくつかあり (CAS は私が最近偶然見つけた 1 つのケースです)、明示的に 4.0 をターゲットにする (または、SupportedRuntime app.config キーを設定する) 必要があります。

于 2012-12-10T15:54:59.940 に答える