使用旧版.NET框架中编译的程序集是否会影响整体性能?

时间:2011-06-02 15:22:22

标签: .net performance .net-4.0 .net-2.0 assemblies

让我们假设我们有两个组件:

  1. Foo.Logic(在.NET 2.0框架上编译)
  2. Foo.Application(在.NET 4.0框架上编译),它引用并使用已编译的Foo.Logic。
  3. 它是否会影响Foo.Application性能(或有任何其他缺点)?

2 个答案:

答案 0 :(得分:19)

在你在问题中描述的情况中,一切都将Just Work™没有任何问题。

.NET 4.0应用程序将.NET 2.0库直接加载到.NET 4.0运行时环境中。除非您明确要求,否则它不会使用并行执行。网络上有很多关于这方面的错误信息或不清楚的陈述,因此在评估你所阅读的内容时要小心。

我终于遇到了this article,这证实了Jon Skeet在回答中所说的话。特别是,该文章解释了(强调增加):

  

In-Proc SxS无法解决库开发人员面临的兼容性问题。 由应用程序直接加载的任何库 - 通过直接引用或Assembly.Load - 将继续直接加载到加载它的应用程序的运行时和AppDomain中。这意味着如果重新编译应用程序以针对.NET Framework 4运行时运行,并且仍然具有针对.NET 2.0构建的依赖程序集,那么这些依赖项也将加载到.NET 4运行时。因此,我们仍然建议根据您希望支持的框架的所有版本测试您的库。这是我们继续保持高水平向后兼容性的原因之一。

但如果您对更多细节感兴趣,值得一提的是,CLR 4.0版本引入的新功能之一是能够同时运行多个版本的运行时在一个过程中。这被称为"In Process Side-by-Side Execution"(或者如果你非常酷,则为“Inproc SxS”),并且是一个非常强大的工具。您可以在CLR团队的博客上阅读有关here的更多信息。

以下是一些用于演示目的的漂亮照片:

请注意用于在.NET 2.0之上构建.NET 3.0和3.5版本的“layer-cake”模型。这意味着他们都会毫无问题地并排行动。但是其他版本的隔离会造成问题。

但是,如上所述,.NET 4.0通过并行执行解决了这个问题:

当然,这主要适用于涉及COM和与Outlook等外部应用程序互操作的情况,但它仍然是一个非常酷的功能。

但不管怎样,你不应该看到这种方法有任何问题,无论是兼容性,性能还是其他任何问题。

答案 1 :(得分:7)

除非您使用显式使用SxS,否则您的.NET 2程序集将加载到.NET 4 CLR中。根本不应该有任何性能问题...最初针对.NET 2的代码将使用.NET 4库和CLR等运行。是的,您可以使用在.NET 1.1中编译的程序集。 .NET 2或更高版本的应用程序。

如果您尝试在.NET 4,IIRC中加载混合模式程序集(某些本机代码,某些IL),那么 会出现问题...但如果它只是“只是”.NET类库,你应该没事。