【问题标题】:.NET 4.6 required for .NET 4.5.2 compiled application.NET 4.5.2 编译的应用程序需要 .NET 4.6
【发布时间】:2017-04-25 03:29:19
【问题描述】:

从在 Visual Studio 2010 和 .NET 4.0 中构建我们的产品升级到 Visual Studio 2015 和 .NET 4.5.2 后,我们发现在客户机器上运行产品时出现问题。

我们看到的错误是在启动应用程序时抛出 System.MissingMethodException,从查看此处的帖子来看,这表明机器上安装了不正确的 .NET 版本。现在客户机器确实安装了 .NET 4.5.2,因为它是在安装我们的产品期间安装的。

我们目前解决此问题的方法是在客户机器上安装 .NET 4.6。

我有一个理想的理论想要证实(最好是垃圾并用更可行的东西代替):

  • 我们所有的项目都设置为针对 .NET 4.5.2 进行编译
  • 编译代码并生成安装程序的构建代理具有 Visual Studio 2015 和 .NET 4.6,但它确实安装了必要的 .NET 4.5.2 框架

我相信因为机器安装了 .NET 4.6,所以它会覆盖 .NET 4.5.2。我不知道为什么会发生这种情况,但我看到了一些模糊的相似之处,即在安装了 .NET 4.5 的机器上运行的 .NET 4.0 应用程序的行为与 .NET 4.5 应用程序的行为方式 here (如果是的话我很漂亮当然不应该)。我希望有人能指出我遗漏的东西。

我确实希望我的理论是错误的。

其他信息

当应用程序崩溃并且错误是:

找不到方法:'!!0[] System.Array.Empty()'。

我的代码中没有使用 Array.Empty()。

堆栈跟踪:

在 MyApp.DisplayExceptionInfo(异常前)
在 E:\Build\MyApp\App.xaml.cs:line 82 中的 MyApp.Main(String[] args) 处

DisplayExceptionInfo 只是试图显示一个异常,这让我相信早先抛出了一个异常。
Main 检查是否有另一个实例正在运行某个互操作(我也尝试删除它,但它没有解决崩溃),然后创建我的 App 类并运行它。

更新

抱歉,我认为我在问题中没有提供足够的详细信息来帮助了解问题的根源。事实证明,TeamCity 使用 MSBuild 来构建 Visual Studio 解决方案,并且在构建过程中出现以下警告(令人讨厌的是埋在日志中):

[GetReferenceAssemblyPaths] C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1097, 5):警告 MSB3644:框架“.NETFramework,Version=v4. 5.2" 没有找到。要解决此问题,请为此框架版本安装 SDK 或 Targeting Pack,或者将您的应用程序重新定位到已安装 SDK 或 Targeting Pack 的框架版本。请注意,程序集将从全局程序集缓存 (GAC) 中解析,并将用于代替引用程序集。因此,您的程序集可能无法正确定位于您想要的框架。

我可以确认我确实安装了 .NET 4.5.2 多目标包,但我会继续调查

【问题讨论】:

  • 它与 已安装 .NET 版本没有任何关系,只有参考程序集很重要。请注意您也没有安装 4.5.2。永远是在构建机器上搞砸的细节,引用 c:\windows\microsoft.net 中的程序集而不是 c:\program files (x86)\reference 程序集是一个非常常见的错误。不记录丢失方法的名称和使用它的代码的 sn-p 很难为您提供帮助。
  • @HansPassant 感谢您的帮助。我可以确认我对 Microsoft dll 的所有引用都没有指定路径(即我通过添加引用中的“程序集”选项卡添加了引用)并且我的印象是这些将使用 c:\program files (x86)\reference 作为你提到。事件日志条目没有提及特定的方法名称,它包含的只是一个有限的 StackTrace,其中包含我的代码中的 2 个方法。我已经添加了我从事件日志条目中获得的信息
  • Array.Empty() 确实是 4.6 中添加的方法。如果没有调试器提供的堆栈跟踪,我们无法看到它是如何到达那里的。
  • @HansPassant 抱歉,我确实添加了它,但在我认为它没有帮助后再次将其删除。我发现另一个已更新的库是针对 4.6 构建的,但是我已将其还原,我们仍然看到问题。
  • 你是对的,堆栈跟踪没有帮助。它必须是在您的代码捕获异常之前捕获的那个。就像 ex.StackTrace 或当您勾选 Thrown 复选框并关闭 Just My Code 时在调试器中获得的那个。如果您的 DisplayExceptionInfo() 方法没有显示它,那么您想改进它,ex.ToString() 总是有帮助的。

标签: visual-studio-2015 msbuild teamcity .net-4.5 .net-4.6


【解决方案1】:

经过一天的调查,似乎 MSBuild 正在使用 .NET 4.6 框架进行构建,因为它找不到已安装的 .NET 4.5.2 框架(尽管已安装多目标包)。

感谢这里的其他帖子,有两种可能的解决方案都有效:

  1. Provide a FrameworkPathOverride to the MSBuild as an argument.
    -p:FrameworkPathOverride="C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework\v4.5.2"
  2. Install the .NET 4.5.2 SDK

我最后选择了选项 2,尽管 Visual Studio 在构建时似乎确实使用了选项 1,但必须指定路径似乎是错误的。

【讨论】:

    【解决方案2】:

    我知道这是一篇旧帖子,但对我来说,我必须安装 MsBuild 2015 更新才能让它工作:

    https://github.com/Microsoft/msbuild/issues/173#issuecomment-192310586

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多