【问题标题】:Loading an assembly targeted for .NET 4.5 on a .NET 4.0 app domain在 .NET 4.0 应用程序域上加载针对 .NET 4.5 的程序集
【发布时间】:2012-09-19 19:51:48
【问题描述】:

假设系统安装了 .NET 4.0 和 .NET 4.5。

是否可以从针对 .NET 4.0 编写的程序集加载和使用 .NET 4.5 程序集?

简单地说,我可以从 .NET 4.0 代码中调用 Assembly.Load 来加载 .NET 4.5 目标程序集吗?

【问题讨论】:

  • 你也想读一下这个:marcgravell.blogspot.nl/2012/09/…!!
  • @ShaunWilde 有时这是不可能的。您可以在一家公司拥有多个团队或应用程序,一个使用 .NET 4.5,一个使用 .NET 4.0。在理想世界中,这不会发生,但在现实世界中,却经常发生。有时您需要在两者之间进行组件互操作。
  • @ShaunWilde 当你有超过 200k 行生产代码时,这很困难,用 VB.NET 2.0 编写,它在几乎所有可以想象的地方都使用“查询”作为变量名。升级到 3.5 或更高版本会认为“查询”是指名称空间“System.Web.Query”,并会触发编译器错误。修复错误需要半年时间。
  • @Nuzzolilo 手动是的,但我确信快速搜索和替换将解决大多数问题 - 乏味的是但可能;即使必须触及 200K+ 的每一行,我怀疑这需要 1/2 年。
  • 另外,如果您认为“接触 200K+ 行项目中的每一行将花费不到 1/2 年的时间”,那么您从来没有在一个庞大的公司项目中工作过一个功能失调的大型开发团队,并且法规...

标签: c# .net .net-4.0 .net-4.5 assembly-loading


【解决方案1】:

假设系统为 .NET 4.0 和 .NET 4.5:

marcgravell's blog 中所述,由 sehe 链接

4.5 是 GAC 中 4.0 之上的就地 Over-the-top 安装;安装 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 迭代器的实现会导致缺少方法引用。但这不应该影响你。

【讨论】:

  • 那么为什么默认不工作呢? -- 你还需要做哪些额外的事情才能让它发挥作用?
  • 显然 .net-4.5 在某些情况下也会尝试表现得像 .net-4.0。例如,System.ComponentModel.Composition 在由初始化为 .net-4.0 的程序加载的 .net-4.5 程序集加载时拒绝关闭打开的泛型类型。这让我很生气,因为我没有意识到框架是在 .net-4.0 模式下运行的,我无法猜测这可能是导致不同行为的原因。
猜你喜欢
  • 2015-11-25
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
相关资源
最近更新 更多