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

lys*_*cid 31 .net c# clr

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

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

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

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

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

Han*_*ant 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作为一个新的并排版本并修复了无法轻易修复的旧错误,而不会有破坏意外依赖于错误行为的代码的风险.它们是非常模糊的错误,并且这些错误修复很可能会对您产生影响.但是,您必须重新测试您的代码以确保.


Sti*_*ipo 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

项目" 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出将是:

来自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程序集统一概述程序集绑定重定向.


Kei*_*thS 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键).