c# - 如何检查可执行文件是否与已安装的 .NET 版本兼容

标签 c# .net compatibility target

我是一名软件测试员。我得到了一个可执行文件来在给定的机器上进行测试。在测试中,可执行文件表现得很奇怪,任何人都无法解释。

经过大量研究和调试,我找到了原因:为 .NET 目标框架 4.6 构建的可执行文件,但机器配备了 .NET 4.5。 这产生了一些“MissingMethodExeception”,即使是像“string.Format()”这样的微不足道的方法。一些 try-catch 捕获了这些异常,但以错误的方式处理它们,因为没有人预料到它们会发生。

这里描述了一个类似的问题:

Method not found: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object)

我的问题:

  1. 当我尝试运行一个可执行文件时,Windows 不是要警告我,但由于没有必要的 .NET 版本而无法正常运行吗?
  2. 通常处理此问题的最佳做法是什么?

(我希望在 VisualStudio 中出现类似复选框“如果目标网络不可用则不执行”的东西?!)

最佳答案

Isn't Windows meant to warn me ...

您肯定会收到警告,不是来自 Windows,而是来自 CLR。对话框 looks like this ,单击"is"会自动在计算机上部署和安装所需的框架版本。 CLR 通过查找 [TargetFramework] attribute 来执行此检查。嵌入到组件中。如前所述,运行 ildasm.exe 以验证此属性。期望它丢失或具有足够低的值,因此不会触发对话框。

What is the best practice to deal with this problem in general?

这是程序错误,程序集构建错误。您确信编译器使用了仅适用于 .NET 4.6 版的引用程序集。这必须追溯到构建它的机器,很可能是构建服务器。它没有正确设置,当构建工程师通过避免使用 Visual Studio 的许可副本来偷工减料时,这种事故很常见。或者通过偏爱免费软件工具,Jenkins 成为一种常见的祸害。

除了 [TargetFramework] 属性错误或丢失之外,这种特殊的错误特别容易引起。只需使用 c:\windows\microsoft.net\framework 中的程序集作为引用程序集,而不是需要目标包并安装在 c:\program files (x86)\reference assemblies 目录中的正确程序集。 This Q+A有更多线索。

修复构建服务器往往有很多阻力点,作为测试人员最好的办法是提交错误报告。您还想为损坏的 catch-em-all 异常处理编写一个,这使得问题很难诊断。

关于c# - 如何检查可执行文件是否与已安装的 .NET 版本兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721444/

相关文章:

c# - InnerHTML 中的 HTMLAgilityPack 解析

c# - EF-core OnModelCreating 方法中的依赖注入(inject)

.net - Log4Net StringMatchFilter 不过滤任何内容

.net - Paypal tls 1.2 SSL 更新 10002

opengl - 编写 OpenGL 和 OpenGL ES 兼容代码的指南?

java - 使用 C# 的 AES 加密和 Java 中的解密

c# - 在 C# 中将 SQLITE SELECT ... IN 语句与字符串数组一起使用会给出空结果,并且数组中存在多个值

c# - 使用多种分隔符类型将文本文件解析为字段

c# - SGML 解析器 .NET 建议

windows - Windows 8 RTM 是否支持 VB6 (SP6) 运行时文件?如果有,是哪些?