从在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.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多目标包但我会继续调查
答案 0 :(得分:10)
经过一天的调查后,似乎MSBuild正在使用.NET 4.6框架构建,因为它无法找到安装的.NET 4.5.2 Framework(尽管安装了多目标包)。
感谢此处的其他帖子,有两种可能的解决方案,这两种方法都有效:
-p:FrameworkPathOverride="C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework\v4.5.2"
我最后使用选项2,因为虽然看起来Visual Studio在构建时确实使用了选项1,但是必须指定路径。
答案 1 :(得分:2)
我知道这是一篇旧帖子,但对我来说,我必须安装MsBuild 2015更新才能让它发挥作用:
https://github.com/Microsoft/msbuild/issues/173#issuecomment-192310586