web-dev-qa-db-ja.com

同じプロセスでの.NET 3.5と4 / 4.5アセンブリの混合

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

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

ONLY THE APPLICATIONを変換して.NET 4.5を使用してコンパイルする場合に、どのランタイム/コアライブラリが使用されるかを知りたいのですが?

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

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

31
lysergic-acid

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

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

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

22
Hans Passant

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

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

プロジェクト 'Net2Library'は。NET Framework 2.0クラスライブラリ次のクラス:

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'は、。NET Framework 4.0コンソールアプリケーションNet2Library.dllを参照し、次のクラスがあります。

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 = Net4Applicationからのb77a5c561934e089: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 and Assembly Binding Redirection

17
Stipo

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キーを設定する).

7
KeithS