Одно уточнение ...
Проблема со всеми упомянутыми методами заключается в том, что они вернут версию 4.0, если сборка была скомпилирована для .NET Framework 4.0, 4.5 или 4.5.1.
Чтобы определить эту версию программно во время выполнения, используйте System.Runtime.Versioning.TargetFrameworkAttribute для данной сборки, например
using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
...
object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true);
var attribute = list.OfType<TargetFrameworkAttribute>().First();
Console.WriteLine(attribute.FrameworkName);
Console.WriteLine(attribute.FrameworkDisplayName);
Вернется
a.FrameworkName ".NETFramework,Version=v4.0" string
a.FrameworkDisplayName ".NET Framework 4" string
a.FrameworkName ".NETFramework,Version=v4.5" string
a.FrameworkDisplayName ".NET Framework 4.5" string
a.FrameworkName ".NETFramework,Version=v4.5.1" string
a.FrameworkDisplayName ".NET Framework 4.5.1" string