【问题标题】:Targeting .NET Framework 4 when Framework 4.5 is installed安装 Framework 4.5 时以 .NET Framework 4 为目标
【发布时间】:2012-12-06 04:47:15
【问题描述】:

我的计算机上安装了 VS2010 和 VS2012,并安装了 .NET Framework 4.0,然后我将其升级到了 .NET Framework 4.5。但是,我仍在开发需要在 .NET Framework 4.0 上运行的应用程序。该项目表示它的目标是 .NET Framework 4(客户端配置文件),这些程序集甚至指向 Referenced Assemblies 下的 .NET Framework 4.0 文件夹。当我将此应用程序移动到只有 4.0 的机器上时,问题就出现了,它不会启动并出现错误,直接的问题是由 WindowState={Binding WindowState} 导致的异常,您在 4.0 中无法做到,但在 4.5 中可以。我需要这个来在我的开发框上抛出异常,为什么不呢?我的假设是,尽管我尽了最大努力,但它使用 4.5 dll(如果存在)。如何在不卸载 4.5 的情况下让它真正使用 4.0?

更新

要重现此安装 .NET Framework 4.5 并创建一个面向 .NET Framework 4.0 的 WPF 项目。将 WindowState 绑定到 VM 中的属性或后面的代码使该属性具有公共获取和私有集。 .NET Framework 4.5 可以很好地处理这个问题,即使 Mode=TwoWay 必须忽略设置的 .NET Framework 4 不会并引发异常:“TwoWay 或 OneWayToSource 绑定无法对类型的只读属性 'State' 起作用.. ."。在带有 .NET Framework 4.5 的盒子上,它就像一个魅力,在只有 .NET Framework 4.0 的机器上试一试,结果它爆炸了……那么,关于如何在安装 4.5 时真正瞄准 4.0 有什么想法吗?

在这里向 MS 报告错误:https://connect.microsoft.com/VisualStudio/feedback/details/774694/targeting-net-framework-4-0-when-4-5-doesnt-seem-to-work

【问题讨论】:

  • 如果您的目标是 .NET 4.0,那么为什么您的代码使用的东西只能在 .NET 4.5 中使用?
  • 假设这是准确的(我对此表示怀疑),它不会在您的开发盒上引发异常,因为您不再安装 .NET 4.0。 .NET 4.5 取代了它。
  • @John:他不知道它只在 4.5 中有效。即使用户碰巧安装了 .NET 4.5,他也希望发生异常。
  • 所以在 Project Properties->Application->Target Framework 下它说 .Net Framework 4 Client Profile?
  • @HansPassant 这就是 .NET 4.5 取代 .NET 4.0 但我想为 .NET 4.0 开发的地方,那么我该如何在不卸载 4.5 的情况下做到这一点,因为我有应用程序要针对 4.5?

标签: c# visual-studio-2010 .net-4.0 .net-4.5 .net-framework-version


【解决方案1】:

是时候提出这个问题了。我不是 WPF 专家,不太喜欢这类问题,调试依赖属性问题是一场噩梦。但我很确定你在追鬼。 WindowState 自 3.0 以来一直是一个依赖属性,在 4.5 中我可以看到或听说过它并没有发生什么特别的事情。

您收到了一些没人能看到的错误消息,这使您确信它与绑定有关。我来自向我展示的州密苏里州。好吧,离威斯康星州够近了。

花更多时间处理代码,这些代码可以为您提供可靠的异常消息和堆栈跟踪,帮助您诊断部署到的机器上的错误,该机器没有调试器来帮助您找出问题所在。为此,您可以为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序。记录或显示 e.ExceptionObject.ToString() 返回值。它为您提供异常消息和神圣堆栈跟踪。如果这没有帮助,请用您看到的内容更新您的问题。

【讨论】:

  • 我无法在示例项目中将其用于回购,因此猜测它抱怨窗口状态是其他原因的结果,但在开发盒上它工作得很好。在测试盒上引发异常,但如果我在测试盒上安装 .NET Framework 4.5 可以正常工作。因此 .NET Framework 4.0 和 .NET Framework 4.5 之间存在明显不同的行为。
  • 我对 Show Me State 的态度非常明确。我解释了你需要做什么来展示它。还是什么都看不到。给我看。
  • 这实际上是一个我们设法在我们的开发团队中重现的错误。所以肯定存在。
【解决方案2】:

你说你不能在测试项目中重现这个。所以这意味着它可能是 应该 在 4.0 中正常工作的东西,对吗?您可能有一些代码组合在 4.0 中因错误而崩溃,该错误已在 4.5 中修复。当您以 4.0 为目标时,只有在您尝试使用编译器可以确定在 4.0 中不受支持的 API/功能时才会收到警告。

应该在 4.0 中工作的东西可能由于一些罕见的错误而崩溃,然后在 4.5 中修复。当您的 4.0 目标应用在 4.5 环境下运行时,它将受到 4.0 中存在的功能的错误修复的影响。

4.0 的更新可能包含错误修复,因此如果用户出于某种原因对 4.5 不满意,则不需要进行 4.5 升级。因此,它甚至可能不是 4.5 的更改,而只是巧合,一些用户没有 4.0 的所有可用更新(这些更新将累积包含在您的 4.5 中)。

这种情况我很少遇到,但有时确实会发生,这也是支持桌面 .NET 应用程序的人们臭名昭著的原因,他们要求用户在花时间之前先尝试在解决奇怪问题时更新 .NET 框架疑难解答。

有时会发生相反的情况。您的代码仅由于 .NET API 的某些错误或不良行为而起作用,后来更新将其清除,也许在某处加强安全性是我见过的最常见的事情,并且您的代码由于次要版本更新而突然中断.NET 的。

【讨论】:

  • 查看该问题的更新,我能够在一个测试项目中重现它,并且它没有警告它不适用于 .NET 4.0(但很好的想法)。绑定到只读属性似乎非常重要,您会认为他们会抓住这一点。您可以通过链接到 MS 错误并 dling 附件来获取测试项目。
  • 如果 Visual Studio 中的 Run/Debug Project 为该目标版本使用某种 .NET 运行时快照,那就太好了。但是,定位并不打算这样做。有些东西根本无法被编译器捕获。当针对特定框架时,​​它只能捕获诸如使用 API、类型、特定函数重载等在该版本中不存在的东西。编译器无法运行代码并查看它是否沿着会引发异常的路径运行。类似地,配置转换在运行/调试期间没有影响,因此难以测试:(
【解决方案3】:

这似乎是 .NET Framework 4.5 中的一个错误,它应该引发异常,但安装了 .NET Framework 4.5 后,您的应用程序无法在 .NET Framework 4.0 上运行,它将始终使用 4.5。

有关详细信息,请参阅此报告的错误: http://connect.microsoft.com/VisualStudio/feedback/details/773682/wpf-property-with-private-setter-is-updated-by-a-twoway-binding

【讨论】:

    【解决方案4】:

    .Net 4.5 将 .net 4.0 替换为新的同名库,实际上有一些修复。 这是简短的回答。

    与早期版本不同,将 .net 4 更新到 4.5 会替换文件,而不是同时添加文件。 即使您有这样的文件夹 Windows/Microsoft.Net/Framework/v40/ , 更新后,这个文件夹有变化。 文件已更改,在 .net 中处理了一些错误,无需开发人员关注。

    如何使用 .net 4.5 定位 4.0 框架? 我还不知道,但我还在挖掘中

    关于这个主题的建议阅读:

    斯科特·汉塞尔曼: http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx

    里克·斯特拉尔: http://weblog.west-wind.com/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

    还有类似的问题,由我创建: https://stackoverflow.com/questions/26483168/errors-on-net-4-0-dont-appear-on-net-4-5

    【讨论】:

      【解决方案5】:

      解决办法:

      VS2015 之后安装 VS2017 时遇到同样的问题:Framework 4.0 刚刚从项目目标列表中消失。

      以下一些 cmets 在这里我尝试过使用 NuGet 包:Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.4 和 1.0.1 的 bin 修复。

      不要那样做!对于同一个项目,我的构建时间增加了约 300%。这是一场灾难。

      我看到 4.5 是 4.0 的“就地替换”,但这并不能解释为什么我在目标框架组合中看不到这两个选项。

      我在网上读到了同样的咒语。这根本不是问题的答案。对于任何与工业机械相关的软件,Framework 4.0 都是必备 - 因为它在 Windows XP 上运行,而 .NET 4.5 上运行。在我的场景中是无用的,可能对于许多其他现实生活中的东西。

      解决方法很简单: 您只需从官方网页下载并安装 Visual Studio 2013 Expresshttps://www.microsoft.com/en-us/download/details.aspx?id=44914

      安装后,打开你的VS2015,你会再次看到4.0

      ... “就地替换……”我的……


      这是我对重复问题给出的答案的重新发布。我在这里发帖是因为这个帖子得到了更多关注,而这里的现有答案没有解决这个问题。

      【讨论】:

        猜你喜欢
        • 2022-12-28
        • 2013-01-12
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 2017-12-15
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多