.NET Core 3.1 считывает версию файла сборки

в моем консольном приложении мне нужно загрузить значение версии файла какой-либо внешней сборки.

var assembly1 = Assembly.LoadFrom("my.dll");
var assembly2 = AssemblyLoadContext.Default.LoadFromAssemblyPath("my.dll");

var versionNumber = assembly1.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;

и вот в чем дело - если я использую var assembly1 = ... или var assembly2 = ..., я получаю неприятное сообщение об ошибке

Не удалось загрузить файл или сборку Microsoft.AspNetCore.Mvc.Core, Version = 3.1.0.0, Culture = нейтральный, PublicKeyToken = adb9793829ddae60

при вызове метода GetCustomAttribute, но если используются обе строки, то все работает нормально. Итак, как это исправить, чтобы можно было использовать var assembly1 = ... или var assembly2 = ...?


person Tony    schedule 25.05.2020    source источник
comment
Из-за этого вы загружаете my.dll в работающее приложение. поэтому my.dll нужна другая сборка, которую вы не загрузили, как при ошибке. (mvc.core). Используйте FileVersionInfo.GetVersionInfo (my.dll) .FileVersion из system.diagnostic, чтобы избежать ошибки.   -  person anilcemsimsek    schedule 25.05.2020
comment
@anilcemsimsek ты прав, спасибо, работает. Я проверил пакет nuget Microsoft.AspNetCore.Mvc.Core, а версии 3.1.0.0 нет. Это странно   -  person Tony    schedule 25.05.2020


Ответы (2)


FileVersionInfo.GetVersionInfo не пытается загрузить в приложение всю DLL:

System.Diagnostics.FileVersionInfo fvo = 
    System.Diagnostics.FileVersionInfo.GetVersionInfo(@"my.dll");

string versionNumber = fvo.FileVersion;

Если вы создаете my.dll с dotnet build -p:Version=4.4.4, versionNumber будет равно "4.4.4.0" в приведенном выше примере кода.

person mm8    schedule 25.05.2020

следующий код является нормальным, проверьте правильность пути.

 private const string AssemblyPath = "C:\\Users\\test.dll";
 var assembly2 = AssemblyLoadContext.Default.LoadFromAssemblyPath(AssemblyPath);
 var versionNumber = assembly2.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;

or

 private const string AssemblyPath = "C:\\Users\\test.dll";
var assembly1 = Assembly.LoadFrom(AssemblyPath);
var versionNumber = assembly1.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;
person Huei Feng    schedule 25.05.2020