Определение версии .net framework в работающем приложении - PullRequest
0 голосов
/ 05 июля 2018

(изм) Почему AssemblyName.Version сообщает об одной и той же версии, даже когда я изменяю целевую версию своего проекта? Как я могу определить действительную версию фреймворка?

Это всегда возвращает 4.0.0.0

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Попробуйте это:

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;
    }
0 голосов
/ 05 июля 2018

Официальный пример от Microsoft для определения версии среды выполнения .NET Framework приведен ниже,

https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#net_d

using System;
using Microsoft.Win32;

public class GetDotNetVersion
{
   public static void Main()
   {
      GetDotNetVersion.Get45PlusFromRegistry();
   }

   private static void Get45PlusFromRegistry()
   {
      const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";

    using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
      {
        if (ndpKey != null && ndpKey.GetValue("Release") != null) {
            Console.WriteLine(".NET Framework Version: " + CheckFor45PlusVersion((int) ndpKey.GetValue("Release")));
        }
         else {
            Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
         } 
    }
   }

   // Checking the version using >= will enable forward compatibility.
   private static string CheckFor45PlusVersion(int releaseKey)
   {
      if (releaseKey >= 461808)
         return "4.7.2 or later";
      if (releaseKey >= 461308)
         return "4.7.1";
      if (releaseKey >= 460798)
         return "4.7";
      if (releaseKey >= 394802)
         return "4.6.2";
      if (releaseKey >= 394254)
         return "4.6.1";      
      if (releaseKey >= 393295)
         return "4.6";      
      if (releaseKey >= 379893)
         return "4.5.2";      
      if (releaseKey >= 378675)
         return "4.5.1";      
      if (releaseKey >= 378389)
       return "4.5";      
    // This code should never execute. A non-null release key should mean
    // that 4.5 or later is installed.
    return "No 4.5 or later version detected";
   }
}   
// This example displays output like the following:
//       .NET Framework Version: 4.6.1

Обновление: Оказалось, что настоящая проблема связана с набором протоколов SSL / TLS по умолчанию, который используется классами .NET Framework, где, если ваши сборки скомпилированы с определенной версией платформы во время компиляции, будут вызывать другое поведение во время выполнения.

Переключатель AppContext имеет значение <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>, как описано в KB3069494,

https://support.microsoft.com/en-us/help/3069494/cannot-connect-to-a-server-by-using-the-servicepointmanager-or-sslstre

Вы можете также ознакомиться с рекомендациями для получения дополнительных советов,

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls?view=netframework-4.7.2

...