.NET 4.5.2编译应用程序

时间:2016-01-27 12:45:59

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

从在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()。

堆栈跟踪:

  

at MyApp.DisplayExceptionInfo(Exception ex)
    在E:\ Build \ MyApp \ App.xaml.cs中的MyApp.Main(String [] args):第82行

DisplayExceptionInfo只是试图显示一个Exception,让我相信之前会抛出异常。
Main检查是否有另一个实例正在通过某个Interop运行(我也尝试删除但它没有解决崩溃),然后创建我的App类并运行它。

更新

抱歉,我不相信我在问题中提供了足够的详细信息,以帮助解决问题的根源。事实证明,TeamCity使用MSBuild构建Visual Studio解决方案,并且在构建过程中会出现以下警告(令人烦恼的是相当好地隐藏在日志中):

  

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

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

2 个答案:

答案 0 :(得分:10)

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

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

  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
  3. 我最后使用选项2,因为虽然看起来Visual Studio在构建时确实使用了选项1,但是必须指定路径。

答案 1 :(得分:2)

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

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