.NET 4.6 需要 .NET 4.5.2 编译的应用程序
.NET 4.6 required for .NET 4.5.2 compiled application
从 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 (如果是,我很确定它不应该)。我希望有人能指出我遗漏的东西。
我希望我的理论是错误的。
附加信息
当应用程序崩溃且错误为:
时,我已设法附加调试器
Method not found: '!!0[] System.Array.Empty()'.
我的代码中没有任何内容使用 Array.Empty()。
堆栈跟踪:
at MyApp.DisplayExceptionInfo(Exception ex)
at MyApp.Main(String[] args) in E:\Build\MyApp\App.xaml.cs:line 82
DisplayExceptionInfo
只是试图显示一个 Exception,这让我相信之前抛出了一个 Exception。
Main
检查是否有另一个实例 运行 通过一些互操作(我也尝试删除但它没有解决崩溃)然后创建我的应用程序 class 并运行它。
更新
抱歉,我认为我在问题中提供的详细信息不足以帮助查明问题的根源。事实证明,TeamCity 使用 MSBuild 来构建 Visual Studio 解决方案,并且在构建过程中出现以下警告(相当烦人地埋在日志中):
[GetReferenceAssemblyPaths] C:\Program Files (x86)\MSBuild.0\bin\Microsoft.Common.CurrentVersion.targets(1097, 5): warning MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.5.2" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
我可以确认我确实安装了 .NET 4.5.2 Multi-Targeting Pack,但我会继续调查
经过一天的调查,似乎 MSBuild 正在使用 .NET 4.6 框架构建,因为它找不到安装的 .NET 4.5.2 框架(尽管安装了多目标包)。
感谢这里的其他帖子,有 2 种可能的解决方案都有效:
- Provide a FrameworkPathOverride to the MSBuild as an argument.
-p:FrameworkPathOverride="C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework\v4.5.2"
- Install the .NET 4.5.2 SDK.
我最后选择了选项 2,虽然看起来 Visual Studio 在构建时确实使用了选项 1,但必须指定路径似乎是错误的。
我知道这是一个旧的 post,但对我来说,我必须安装 MsBuild 2015 更新才能让它工作:
https://github.com/Microsoft/msbuild/issues/173#issuecomment-192310586
从 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 (如果是,我很确定它不应该)。我希望有人能指出我遗漏的东西。
我希望我的理论是错误的。
附加信息
当应用程序崩溃且错误为:
时,我已设法附加调试器Method not found: '!!0[] System.Array.Empty()'.
我的代码中没有任何内容使用 Array.Empty()。
堆栈跟踪:
at MyApp.DisplayExceptionInfo(Exception ex)
at MyApp.Main(String[] args) in E:\Build\MyApp\App.xaml.cs:line 82
DisplayExceptionInfo
只是试图显示一个 Exception,这让我相信之前抛出了一个 Exception。
Main
检查是否有另一个实例 运行 通过一些互操作(我也尝试删除但它没有解决崩溃)然后创建我的应用程序 class 并运行它。
更新
抱歉,我认为我在问题中提供的详细信息不足以帮助查明问题的根源。事实证明,TeamCity 使用 MSBuild 来构建 Visual Studio 解决方案,并且在构建过程中出现以下警告(相当烦人地埋在日志中):
[GetReferenceAssemblyPaths] C:\Program Files (x86)\MSBuild.0\bin\Microsoft.Common.CurrentVersion.targets(1097, 5): warning MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.5.2" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
我可以确认我确实安装了 .NET 4.5.2 Multi-Targeting Pack,但我会继续调查
经过一天的调查,似乎 MSBuild 正在使用 .NET 4.6 框架构建,因为它找不到安装的 .NET 4.5.2 框架(尽管安装了多目标包)。
感谢这里的其他帖子,有 2 种可能的解决方案都有效:
- Provide a FrameworkPathOverride to the MSBuild as an argument.
-p:FrameworkPathOverride="C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework\v4.5.2"
- Install the .NET 4.5.2 SDK.
我最后选择了选项 2,虽然看起来 Visual Studio 在构建时确实使用了选项 1,但必须指定路径似乎是错误的。
我知道这是一个旧的 post,但对我来说,我必须安装 MsBuild 2015 更新才能让它工作:
https://github.com/Microsoft/msbuild/issues/173#issuecomment-192310586