Как узнать название и версию целевой платформы из exe? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть несколько exe-файлов, которые были созданы с использованием. net framework 4.5 или. net core 2.1 или. net core 3.1.

Я хочу получить информацию об имени и версии платформы из этой DLL, используя только приложение c#.

Я написал ниже фрагмент кода, который полезен и отлично работает с файлами DLL, но не с exe.

var dllInformation = Assembly.LoadFrom(@"D:\\MyProgram.dll");
Console.WriteLine(dllInformation.FullName);
Console.WriteLine(dllInformation.ImageRuntimeVersion);
Console.WriteLine(((TargetFrameworkAttribute)dllInformation.GetCustomAttributes(typeof(TargetFrameworkAttribute)).First()).FrameworkName);

Я также пошел по этим ссылкам, но я не нашел их полезными для файлов exe:

информация из файла exe

Определить. NET Версия Framework для dll

Пожалуйста, дайте мне знать, если есть какие-либо предложения.

Ответы [ 2 ]

3 голосов
/ 01 июня 2020

Следующая программа должна отображать версию сборки. Программа загружает две сборки во время выполнения, используя метод Assembly.LoadFrom. 1) представляет собой сборку. NET Fx и 2) представляет собой сборку. NET сердечника. Он загружает оба и отображает версию фреймворка без проблем. Этот проект находится в github . Если вы используете проект github, вам необходимо установить. NET Core 3.1.

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;

namespace net007
{
    class Program
    {
        static void Main(string[] args)
        {
            //A .net framwwork dll in the same output fodler
            //as the current executable
            var fxAssembly = Assembly.LoadFrom("fx.console.app.exe");

            //A .net core dll in the same output fodler
            //as the current executable
            var netCoreAssembly = Assembly.LoadFrom("core.console.app.dll");

            ShowFrameworkVersion(fxAssembly); //.NETFramework,Version=v4.7.2
            ShowFrameworkVersion(netCoreAssembly);//.NETCoreApp,Version = v3.1
        }

        static void ShowFrameworkVersion(Assembly assembly)
        {
            var attributes = assembly.CustomAttributes;
            foreach (var attribute in attributes)
            {
                if (attribute.AttributeType == typeof(TargetFrameworkAttribute))
                {
                    var arg = attribute.ConstructorArguments.FirstOrDefault();
                    if (arg == null)
                        throw new NullReferenceException("Unable to read framework version");
                    Console.WriteLine(arg.Value);
                }
            }
        }
    }
}
0 голосов
/ 28 мая 2020

Вы можете использовать PowerShell для определения целевой версии платформы:

$path = "C:\your dll here.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value
...