在同一进程中将.NET 3.5与4 / 4.5程序集混合使用

问题描述 投票:32回答:3

我想将基于.NET 3.5 WinForms的应用程序迁移到最新的.NET版本(4.5)。

该应用程序使用“外部”组件(可以被认为是插件),这些组件目前也是基于.NET 3.5的。

我想知道在我们只使用.NET 4.5转换应用程序进行编译的情况下使用了什么运行时/核心库?

这种情况应该适当吗? (在4.5进程中加载​​.NET 3.5程序集)? *插件程序集通过反射加载。

CLR运行时如何处理这种情况?这是一种安全的做法吗?

c# .net clr
3个回答
22
投票

如果您将应用程序的主要EXE重新编译为目标.NET 4.x或使用带有<supportedRuntime>元素的app.exe.config文件来强制使用CLR版本4,那么您可以毫不费力地同时使用.NET 3.5和.NET 4.0程序集。 CLR v4在读取3.5组件时没有问题,它向后兼容。不是相反,CLR v2无法读取版本4程序集,这就是为什么你需要.config文件,如果你的EXE不是针对v4。

唯一的缺点是3.5程序集对旧框架程序集的依赖关系。例如,它会询问mscorlib.dll的2.0.0.0版。 CLR会自动转换这些请求,并将其替换为4.0.0.0版。一般情况下,标准的4.0框架组件与旧版本非常兼容。

然而,微软确实借此机会将4.0作为一个新的并排版本并修复了无法轻易修复的旧错误,而不会有破坏意外依赖于错误行为的代码的风险。它们是非常模糊的错误,并且这些错误修复很可能会对您产生影响。但是,您必须重新测试您的代码以确保。


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

Project'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 = 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 OverviewAssembly Binding Redirection


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键)。

© www.soinside.com 2019 - 2024. All rights reserved.