微软破坏了.NET的兼容性?

4
几天前,我的.NET 3.5应用程序在启动时开始发生错误,提示“无法找到运行此应用程序所需的运行时版本”。由于我没有对它们做任何操作,这让我感到很奇怪。经过一些调查,我发现原因是Windows自动更新安装了.NET 3.5或.NET 4的服务包到我的计算机上(我不知道哪个有罪)。该更新无法卸载,因为在控制面板中未显示在已安装的Windows更新列表中。我不得不恢复系统还原点!今天,我的一个客户抱怨遇到了同样的问题。我不能强迫他恢复系统还原,所以我需要知道如何克服这个愚蠢的Microsoft问题。请问有谁能分享你的想法吗?附言:该软件受CodeVeil 1.2保护,也许这很重要。

3
故障出现在哪里?你能发布导致错误的代码吗?你有堆栈跟踪吗?异常细节?还有其他相关细节吗? - Oded
软件运行时出现故障。没有代码,没有堆栈跟踪,没有异常,只有一个错误消息框,显示无法找到运行时的错误。在MS Visual Studio中无法重现此问题。也许这是由于使用了CodeVeil保护导致的,我还不确定。 - Alex
1
这是在XP上吗?最近的更新破坏了一些WCF东西。要卸载更新,请在添加/删除程序中选中“显示更新”复选框。这也可能与正在更新的 System.dll 有关。 - leppie
3个回答

2

在我们能为此提出修复建议之前,需要了解发生了什么。解决此问题的第一步是获取更多信息

  • 您的应用程序是针对哪个版本的CLR编译的?
  • 机器上安装了哪些版本的CLR?
  • 机器的操作系统是什么?

通常,当应用程序针对未安装在机器上的CLR版本进行编译时,就会出现此错误消息。例如,拥有2.0应用程序但仅有4.0 CLR。


在我的电脑上,我有3.5(噢,是的,实际上这是2.0 :))。应用程序编译为使用3.5。更新安装之前软件可以正常工作。我没有做任何操作,所以是更新破坏了软件。我恢复到系统还原点,软件又可以正常工作了。我的Windows是7,64位。 - Alex
这很有趣,不是吗?微软没能设计他们的CLR向后兼容? - chiccodoro
1
@chiccodoro,CLR在很大程度上支持向后兼容,但真正的100%向后兼容意味着你不能真正改变太多。有很多有趣的例子,其中非常微小的更改会导致应用程序中难以跟踪的问题。这是他们决定2.0应用程序不会自动升级到4.0 CLR的原因之一。可以通过在.config文件中添加supportedRuntimes条目来完成此操作。 - JaredPar
@Alex 如果有更新的话,它应该会显示在其中一个日志中。你是否检查了控制面板中的“程序和功能”条目,并点击了“查看已安装的更新”? - JaredPar

1

感谢大家的帮助!

我最终弄清楚了这是旧版本的CodeVeil惹的祸,导致应用程序崩溃。在安装.NET 4.0更新后,所有由CodeVeil 1.2保护的应用程序都完全崩溃了。我购买了最新版本的产品,现在它已经能够正常工作。


-1
在我的情况下,问题很容易解决,只需在app.config文件中添加先前的运行时版本,如此处所述https://msdn.microsoft.com/en-us/library/jj152935(v=vs.110).aspx
<?xml version="1.0"?>
<configuration>
    <startup>
        <supportedRuntime version="<YOUR_VERSION>"/>
    </startup>
</configuration>

在您的情况下,按照上述文档应该是 "v2.0.50727",因为此字符串也被映射为.NET 3.5。
可能版本的列表在这里 https://msdn.microsoft.com/en-us/library/jj152935(v=vs.110).aspx

你的解决方案很容易破坏构建 :) 正如我所说,我的应用程序是.NET 3.5。 - Alex
@Alex,我又做了同样的问题,并搜索了有关这些字符串版本的信息。根据https://msdn.microsoft.com/en-us/library/jj152935(v=vs.110).aspx.NET 3.5的正确字符串确实是“v2.0.50727”。如果是正确的,那么原始答案也是正确的。 - campisano

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