正在运行的应用程序中确定.net framework版本

正在运行的应用程序中确定.net framework版本,.net,windows,frameworks,version,.net-assembly,.net,Windows,Frameworks,Version,.net Assembly,(编辑) 为什么即使我更改了项目的目标版本,AssemblyName.Version也会报告相同的版本?如何确定框架的实际执行版本 这始终返回4.0.0.0 foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var aName = assembly.GetName(); Console.WriteLine($"{aName.Name} {aName

(编辑) 为什么即使我更改了项目的目标版本,AssemblyName.Version也会报告相同的版本?如何确定框架的实际执行版本

这始终返回4.0.0.0

foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            var aName = assembly.GetName();
            Console.WriteLine($"{aName.Name} {aName.Version}" );
        }

Microsoft检测.NET Framework运行时版本的官方示例如下:

更新: 事实证明,真正的问题与.NET Framework类使用的默认SSL/TLS协议集有关,如果在编译时根据某个框架版本编译程序集,则会触发不同的运行时行为

AppContext开关为

您还可以查看最佳实践文章以了解更多提示

试试这个:

private static string GetExecutingAssemblyTargetFramework()
    {
        string result = string.Empty;
        System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
        System.Runtime.Versioning.TargetFrameworkAttribute targetFrameworkAttribute = asm.GetCustomAttributes(
            typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).FirstOrDefault()
            as System.Runtime.Versioning.TargetFrameworkAttribute;
        if (targetFrameworkAttribute != null)
            result = targetFrameworkAttribute.FrameworkDisplayName;
        return result;
    }
您也可以使用原始问题中的相同循环:

        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            Console.WriteLine(GetAssemblyTargetFramework(assembly));
        }

   private static string GetAssemblyTargetFramework(System.Reflection.Assembly asm)
    {
        string result = string.Empty;
        System.Runtime.Versioning.TargetFrameworkAttribute targetFrameworkAttribute = asm.GetCustomAttributes(
            typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).FirstOrDefault()
            as System.Runtime.Versioning.TargetFrameworkAttribute;
        if (targetFrameworkAttribute != null)
            result = targetFrameworkAttribute.FrameworkDisplayName;
        return result;
    }

这并没有回答我要问的问题。这回答了“安装了哪些版本?”的问题。我问的是“当前应用程序使用的是哪个版本?”请注意我帖子第一句中的斜体字。@elroyFlyn您的应用程序只能使用已安装的.NET Framework版本(因为.NET Framework 4.x使用就地升级)。这就是所谓的运行时版本。如果您需要其他版本号,请再次编辑您的问题。那么(的其他部分)是如何发生的当我以不同的framework版本为目标并在同一台计算机上运行时,我的应用程序会产生不同的结果?如前所述,我将目标从4.5更改为4.6并获得不同的行为。好吧,这是你真正的问题。Microsoft设计了兼容层,以假装你的应用程序运行在较旧的.NET framework版本上,这是如果您查看文档(如“兼容性开关”部分),就会知道这一点。根据您观察到的行为差异,有相应的解决方法。好的,我发现我最初的问题信息不充分。我接受您的回答。如果您可以编辑它,开始时说“许多.net版本都在进行升级,其中程序集继续报告原始版本值。要确定实际版本,请阅读注册表,如以下代码所示。“(对吗?)关于我真正的问题,当需要tls 1.2时,WebRequest失败,当目标fw<4.6 vs.4.6,运行在4.7.1上时,我还没有找到相关的兼容性切换,但仍在寻找。Thank.OP没有寻找TargetFramework,他在寻找当前正在执行的框架版本。Target framework是一个ind构建程序集所依据的框架,而不是当前执行程序集的框架。
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            Console.WriteLine(GetAssemblyTargetFramework(assembly));
        }

   private static string GetAssemblyTargetFramework(System.Reflection.Assembly asm)
    {
        string result = string.Empty;
        System.Runtime.Versioning.TargetFrameworkAttribute targetFrameworkAttribute = asm.GetCustomAttributes(
            typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).FirstOrDefault()
            as System.Runtime.Versioning.TargetFrameworkAttribute;
        if (targetFrameworkAttribute != null)
            result = targetFrameworkAttribute.FrameworkDisplayName;
        return result;
    }