我想将基于.NET 3.5 WinForms的应用程序迁移到最新的.NET版本(4.5)。
该应用程序使用当前基于.NET 3.5的“外部”组件(可以被认为是插件)。
我想知道在使用.NET 4.5转换 ONLY THE APPLICATION 进行编译的情况下使用了哪些运行时/核心库?
这种情况应该适当吗? (在4.5进程中加载.NET 3.5程序集)? *插件程序集通过反射加载。
CLR运行时如何处理这种情况?这是一种安全的做法吗?
答案 0 :(得分: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作为一个新的并排版本并修复了无法轻易修复的旧错误,而不会有破坏意外依赖于错误行为的代码的风险。它们是非常模糊的错误,并且这些错误修复很可能会对您产生影响。但是,您必须重新测试您的代码才能确保。答案 1 :(得分: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 '这是 .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,版本= 4.0.0.0,文化=中性, 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,版本= 4.0.0.0,文化=中性, 公钥= b77a5c561934e089
您还可以查看以下资源: .NET Framework Assembly Unification Overview和Assembly Binding Redirection。
答案 2 :(得分: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密钥)。