web-dev-qa-db-fra.com

Mélange de .NET 3.5 avec des assemblages 4 / 4.5 dans le même processus

Je voudrais migrer une application basée sur .NET 3.5 WinForms vers la dernière version .NET (4.5).

L'application utilise des composants "externes" (qui peuvent être considérés comme des plugins) qui sont également actuellement basés sur .NET 3.5.

Je voudrais savoir quelles bibliothèques d'exécution/de base sont utilisées au cas où nous convertirions NIQUEMENT L'APPLICATION pour compiler en utilisant .NET 4.5?

Ce scénario devrait-il fonctionner correctement? (chargement d'assemblys .NET 3.5 dans un processus 4.5)? * Les plugins sont chargés par réflexion.

Comment le runtime CLR gère-t-il un tel scénario? est-ce une pratique sûre?

31
lysergic-acid

Si vous avez recompilé le fichier EXE principal de votre application pour cibler .NET 4.x ou utilisez un fichier app.exe.config avec le <supportedRuntime> élément pour forcer CLR version 4 à s'habituer, vous n'aurez aucun problème à utiliser les assemblys .NET 3.5 et .NET 4.0. CLR v4 n'a aucun problème à lire les assemblages 3.5, il est rétrocompatible. Pas l'inverse, CLR v2 ne peut pas lire les assemblys de la version 4, c'est pourquoi vous avez besoin du fichier .config si votre EXE ne cible pas la v4.

Le seul problème est les dépendances de votre 3.5 Assembly sur les anciens assemblys de framework. Il demandera par exemple la version 2.0.0.0 de mscorlib.dll. Le CLR automatiquement traduit ces demandes et les remplace par la version 4.0.0.0. Ce qui en général fonctionne très bien, les assemblages de framework 4.0 standard sont très compatibles avec les anciennes versions.

Microsoft a cependant saisi l'occasion avec 4.0 étant une nouvelle version côte à côte et corrigeant d'anciens bogues qui ne pouvaient pas être facilement corrigés sans risquer de casser du code qui reposait accidentellement sur le comportement du buggy. Ce sont des bogues très obscurs et il est peu probable que ces corrections de bogues vous contournent. Vous devez cependant retester votre code pour vous en assurer.

22
Hans Passant

Tous les assemblys utiliseront des types de .NET Framework que l'application cible.

Voici un test simple:

Projet ' Net2Library ' qui est une . Bibliothèque de classes NET Framework 2.0 avec classe suivante:

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;
        }
    }
}

Projet ' Net4Application ' qui est une . Application console NET Framework 4.0 qui fait référence à Net2Library.dll et a la classe suivante:

using System;
using Net2Library;

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

La sortie de la console sera:

Depuis 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 Depuis 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 = neutre, PublicKeyToken = b77a5c561934e089

Vous pouvez également consulter les ressources suivantes: .NET Framework Assembly Unification Overview et Assembly Binding Redirection .

17
Stipo

Si vous avez un assembly 3.5 référencé à partir d'un exécutable 4.5, les deux assemblys s'exécuteront dans l'environnement CLR 4.5. Cependant, l'assembly 3.5 ciblera les bibliothèques v3.5, pas la v4.0 (bien que les bibliothèques 4.0 auront toutes les mêmes fonctionnalités que la 3.5, et plus).

Donc, au moins d'après mon expérience, si vous voulez des assemblys ciblant 2.0-3.5 et d'autres assemblages ciblant 4.0-4.5, vous aurez besoin des versions de framework 3.5 et 4.5 installées sur l'ordinateur client. La version 3.5 est entièrement rétrocompatible avec la version 2.0, vous pouvez donc utiliser les versions 3.5, 3.0 et 2.0 dans un même environnement. La version 4.0-4.5 est compatible avec la plupart des anciens codes, mais il y a des changements de rupture (CAS est un cas sur lequel je suis tombé récemment), et vous devez cibler explicitement 4.0 (ou configurer une clé App.config SupportedRuntime).

7
KeithS