31

I'd like to migrate a .NET 3.5 WinForms based application to the latest .NET version (4.5).

The application uses "external" components (can be thought of as plugins) that are also currently .NET 3.5 based.

I'd like to know what runtime/core libraries are used in case we convert ONLY THE APPLICATION to compile using .NET 4.5?

Should this scenario properly work? (loading .NET 3.5 assemblies in a 4.5 process)? * The plugin assemblies are loaded via reflection.

How does the CLR runtime handle such a scenario? is this a safe practice?

4

3 回答 3

24

如果您将应用程序的主 EXE 重新编译为面向 .NET 4.x 或使用带有<supportedRuntime>元素的 app.exe.config 文件来强制使用 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 框架程序集与旧版本非常兼容。

然而,微软确实抓住了这个机会,将 4.0 作为一个新的并行版本并修复了无法轻易修复的旧错误,而不会冒着破坏意外依赖错误行为的代码的风险。它们是非常晦涩的错误,这些错误修复不太可能让您感到厌烦。但是,您必须重新测试您的代码以确保。

于 2012-12-10T16:11:56.837 回答
17

所有程序集都将使用应用程序所针对的 .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 ”是一个引用 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 程序集统一概述程序集绑定重定向

于 2012-12-10T16:45:20.057 回答
7

如果您有一个从 4.5 可执行文件引用的 3.5 程序集,则这两个程序集都将在 4.5 的 CLR 环境中运行。但是,3.5 程序集将针对 v3.5 库,而不是 v4.0(尽管 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。4.0-4.5 与大多数旧代码兼容,但有一些重大更改(CAS 是我最近偶然发现的一种情况),您必须明确定位 4.0(或设置 SupportedRuntime app.config 键)。

于 2012-12-10T15:54:59.940 回答