.NET中的多目标定位技术

11

在阅读了多篇博客之后,我对“多目标”或“并行执行”的术语感到很困惑。

  1. 一些博客说,并行执行意味着一个进程中有两个版本的CLR。另一些人则声称,这类似于.NET 2.0和.NET 3.0程序集并行执行。我非常失望,不确定谁是对的谁是错的。

  2. 我还看到许多博客文章,比如Scott Hanselman的博客等(这让我很困惑),它们说如果目标框架是4.0,那么.NET 4.5的任何功能都将无法使用。我可以同意这一点。但我不能同意或理解这样一个事实:在4.5中修复了4.0中的某个问题的功能,如果我在4.5中构建并在4.0中部署,将会被“隐藏”。我不理解“隐藏”这个术语,也没有人敢解释其真正含义。这是运行时错误吗?编译时错误吗?不可能是这样的。这是否意味着不一致的行为?异常?如果是这样,我想知道为什么微软允许在VS开发中出现这种灵活性。它有任何作用吗?我理解第一种情况是有意义的,但不理解或同意第二种情况。

  3. 我还看到Rick/Scott Hanselman的文章中说,重大改变意味着完全升级,包括CLR。那么,我应该将3.0视为重大升级,但它并不是,因为它仍使用.NET 2.0 CLR。那么为什么命名术语是3.0.x.x/3.5.x.x?就像.NET 4.0.30319.x中的情况一样,其中CLR也是新的,所以我同意这一点。我很惊讶谁是正确的。这些人还是MSDN都违背了他们的原则(就像MSDN说格式为Major.Minor.Build.Revision,而Hanselman或其他人说,Major表示CLR升级,而在.NET 3.0中并没有这个情况)。

参考: http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx

http://msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx

对于以上两个问题,您有什么想法?


该文章讨论了.NET版本控制和多重目标设置的问题,并指出.NET 4.5是.NET 4.0的就地升级。 MSDN链接提供了关于使用Visual Studio和.NET Framework进行开发的详细信息。
4个回答

2
首先,您必须了解多目标和并行执行之间的区别。
“多目标编译”是指您可以编译应用程序,该程序将在与您用于开发应用程序不同的CLR运行时上运行(例如VS2010的.NET 4.0或VS 2012的.NET 4.5)。在VS中实现多目标编译可以确保您的应用程序不会使用任何在CLR运行时和基础类库(BCL)中引入的新版本中引入的类型或方法。VS通过在每个可被定位的运行时中拥有DLL的副本来实现这一点。
“并行执行”意味着您可以在计算机上安装多个CLR运行时版本。从CLR 4.0开始,这种说法已经不再正确。现在,您可以在同一个进程中同时加载CLR 4和旧版运行时(CLR 1.1或CLR 2.0)。请阅读http://msdn.microsoft.com/en-us/magazine/ee819091.aspx("行为概述"部分)以了解更多详情。
关于您的问题:
  1. 请阅读上述提到的MSDN文章中的链接。
  2. 隐藏术语意味着当您在.NET 4.5下调试应用程序时,您将拥有具有漏洞修复的BCL版本, 这可能会在您部署到.NET 4.0后对您造成影响,因为该版本的BCL尚未修复该漏洞。 您将遇到运行时错误,这取决于您所遇到的错误类型。这可能是安全问题、应用程序中的逻辑错误或运行时异常。 如果您想捕获这些问题,您可以始终在仅安装了.NET 4.0的干净PC上进行测试。
  3. 您提供的两个链接在任何方面都不会相互干扰。Scott和MSDN在解释.NET的哪个版本具有安装的CLR运行时版本方面都是正确的。

嗨,codevision,非常感谢您的回答 :) 很有帮助。让我们也邀请其他人发表意见 :) 干杯 - Jasmine

0
一些博客文章称,"并行执行(side by side execution)"意味着在一个进程中有两个版本的CLR。还有一些人声称,就像.NET 2.0和.NET 3.0程序集并行执行一样。我非常失望,我不确定谁对谁错。

这些"其他人"只是在误导自己。.NET Framework 2.0和3.0程序集并不是"并行执行"。正如许多其他人所说,只有在运行CLR 1.x / 2.0 / 4.0混合版本时,并行执行才有意义。

微软已经在VS开发中提供了这种灵活性。它有任何用处吗?

如果Windows/.NET报告在原始.NET Framework 4.0上运行.NET Framework 4.5应用程序时出现不兼容性,那将会很有益。但是,这将需要付出太多努力才能实现,因为几乎不可能修补广泛发布的.NET Framework 4.0。

在这种情况下,微软希望开发人员自己变得聪明。当他们观察到不兼容性(无论是运行时异常、编译时错误还是其他任何情况),他们应该检查是什么原因并解决。

那么为什么命名术语是3.0.x.x/3.5.x.x呢?
这只是历史的一部分,问为什么是毫无意义的。微软从这些错误中吸取教训,.NET Core正在正确的轨道上发展。

0

这是我的看法。

.NET已经发展了多个版本和多个运行时。新版本的.NET可能有也可能没有新的运行时。

.NET 1.0附带了一个运行时。 .NET 1.1是对现有系统进行修复和添加的一堆内容。它是一个增量升级。

因此,任何针对1.0的东西,在不依赖于那些已修复的错误等情况下,都可以无缝地在1.1上运行。

.NET 2.0是一个全新版本,具有全新的运行时。 现在您的PC可以同时安装1.1和2.0,并且1.1应用程序将使用.NET 1.1运行时,而2.0应用程序将使用2.0运行时。

3.0和3.5版本会变得有点复杂。它们可能包含一些修复(我认为),但主要是向库中添加了一堆类,并仍然使用相同的2.0运行时。

现在,3.5应用程序仍将使用.NET 2.0运行时,并且将正常工作。它们不知道3.5中添加的新类(例如:LINQ),也不必知道。

.NET 4.0 是全新的运行时。它可以与2.0和3.5同时安装。针对.NET 2.0的应用程序仍需要使用并在.NET 2.0运行时上运行,而为.NET 4.0编译的新应用程序将使用新运行时。在.NET 4.0中引入了一些更改,涉及程序集的定位和加载方式,因此,如果您仅将2.0应用程序编译为4.0使用,则可能会出现一些问题。但是一旦您修复这些问题(如果有的话),它就可以正常工作。

现在... .NET 4.5又是一个略有不同的故事。它是一个新运行时(据我所知),但它正在替换4.0中的那个运行时。您不能同时运行4.0和4.5。现在,面向4.0的应用程序将在4.5运行时上运行......其中应用了一些修补程序。因此,如果您的应用程序依赖于4.0中可用的错误,它将在4.5上出现问题。

这是一个简要而粗略的答案。如果您发现任何问题/不匹配/可能的改进,请随时进行编辑。

希望有所帮助


0
  1. 并行执行意味着一个进程中有多个CLR。.NET2和.NET3.5不是并行的,因为CLR是相同的。然而,.NET2和.NET4是并行的。
  2. 你说的“在.NET4.5中构建并在.NET4.0中部署”是什么意思?
  3. 你要求对一些由微软营销决定的事情进行清晰明确的技术区分。

Tormod,什么是DLL Hell问题解决?并行执行任务集?我可以选择3.5或3.0或2.0框架装配件。版本号是Dell Hell的解决方案吗?为什么所有这些术语都不够清晰?我很好奇并行执行到底是指CLR,如你所说,还是像许多博客甚至MSDN中所说的那样,是指装配体? - Jasmine
多目标只是指针对特定版本进行编译。就像Tormod所说的那样,Side by side实际上意味着运行时能够将多个.NET版本加载到内存中并一起执行它们(例如:混合2.0 dll和4.5 dll)。 - Robert Hoffmann

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