在.NET 4.0应用程序域中加载针对.NET 4.5的程序集

15
假设系统已经安装了.NET 4.0和.NET 4.5。
在一个针对.NET 4.0编写的程序集中,能否加载并使用针对.NET 4.5编写的程序集?
简单来说,我是否可以从.NET 4.0代码调用 Assembly.Load 来加载一个针对.NET 4.5的程序集?

2
你需要阅读这篇文章:http://marcgravell.blogspot.nl/2012/09/iterator-blocks-missing-methods-and-net.html,太重要了!! - sehe
1
@ShaunWilde 有时这是不可能的。在一个公司中,你可能有多个团队或应用程序,其中一个使用.NET 4.5,另一个使用.NET 4.0。在理想的世界中,这种情况不会发生,但在现实世界中,它经常发生。有时你需要在两者之间互操作组件。 - marknuzz
3
@ShaunWilde 当你有超过200,000行用VB.NET 2.0编写的生产代码时,这就很困难了,在几乎每一个可能的地方使用"query"作为变量名。升级到3.5或更高版本会认为"query"是指命名空间"System.Web.Query",从而触发编译器错误。修复这些错误需要半年时间。 - marknuzz
1
@Nuzzolilo 手动操作是可以的,但我相信快速搜索和替换就能解决大部分问题——虽然很繁琐,但是可行的;即使需要检查 20 万多行代码的每一行,我也不认为需要半年的时间。 - Shaun Wilde
3
如果你认为“触及20万行代码的每一行不到半年就能完成”,那么你可能从未参与过一个巨大的公司项目,这个项目有着庞大而功能失调的开发团队和规定。 - BrainSlugs83
显示剩余3条评论
1个回答

12
假设系统为.NET 4.0和.NET 4.5: 如sehe链接的marcgravell博客所述: 4.5是在GAC中对4.0进行现场安装的;一旦安装了4.5,4.0将使用4.5程序集运行。 然后,从针对4.0的.NET代码(由4.0编译器编译)调用Assembly.Load实际上将使用4.5框架实现运行,因此我不认为无法加载4.5程序集存在任何理由。 margravell指出,当您尝试在只安装了4.0的系统上运行.NET 4.5编译的代码时,yield return / break迭代器的实现会导致缺少方法引用问题。但这不应影响您。

4
那么为什么默认情况下它不能工作呢?--你需要做什么额外的事情来使它工作? - BrainSlugs83
1
显然,.net-4.5在某些情况下也会尝试像.net-4.0一样运行。例如,当由一个以.net-4.0初始化的程序加载一个.net-4.5程序集时,System.ComponentModel.Composition拒绝关闭打开的泛型类型。这让我很困扰,因为我没有意识到框架是在.net-4.0模式下运行,也无法猜测这可能是不同行为的原因。 - binki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接