Трудно получить данные проекта (продукт, версию), если проект был собран как опубликованный выпуск (в VS: Сборка -> Выбор публикации). Этот способ не работает
var assembly = Assembly.GetExecutingAssembly();
var version = FileVersionInfo.GetVersionInfo(assembly.Location);
потому что нет доступа к сборке. Я нашел решение
GetType().Assembly.GetName().Version.ToString();
но таким образом я могу получить только версию, а не другие атрибуты проекта (Компания, Продукт). Как я могу получить все данные проекта? Может быть, нужно настроить публикацию?
Снова: Сборка НЕ работала (недоступна) в случае опубликованного выпуска, но все в порядке при отладке или запуске из кода.
P.S. Настройки публикации
П.П.С. Попробуйте запустить «старый» код Нажмите F10
Похоже, он пытается выполнить следующую строку
var version = FileVersionInfo.GetVersionInfo(assembly.Location);
но таким образом я могу получить только версию, а не другие атрибуты проекта (Компания, Продукт). Как я могу получить все данные проекта? Может быть, нужно что-то настроить публикацию?
Ну, по вашему описанию и сценарию, возможно, вы слышали о Рефлексия. В Reflection вы увидите класс AssemblyName, как показано ниже:
Используя AssemblyName class
, вы можете получить Company
, Version
и Product Name
, а также гораздо больше информации, которая обычно доступна в сборке.
Если вы перейдете к свойствам вашего проекта, вы увидите следующую вкладку:
Итак, вы можете получить всю информацию здесь, используя AssemblyName
.
Давайте посмотрим на пример на практике:
Чтобы получить Company
, Version
и Product Name
, я буду использовать интерфейс и сервис как синглтон, а затем внедрить как сервис в файл program.cs.
Сорт:
общедоступный класс ProjectInfo { общедоступная строка? ИмяПродукта {получить; набор; } общедоступная строка? Версия {получить; набор; } общедоступная строка? Компания {получить; набор; } }
Примечание. Вы можете добавить любое свойство, которое вам нужно из сборки.
Интерфейс:
public interface IAssemblyInfoService
{
string GetProductName();
string GetVersion();
string GetCompany();
}
Выполнение:
public class AssemblyInfoService : IAssemblyInfoService
{
private readonly Assembly _assembly;
public AssemblyInfoService()
{
_assembly = Assembly.GetEntryAssembly();
}
public string GetProductName()
{
return _assembly.GetName().Name;
}
public string GetVersion()
{
return _assembly.GetName().Version.ToString();
}
public string GetCompany()
{
var attribute = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(_assembly, typeof(AssemblyCompanyAttribute));
return attribute != null ? attribute.Company : "Unknown";
}
}
программа.cs:
builder.Services.AddSingleton<IAssemblyInfoService, AssemblyInfoService>();
Вытащите информацию:
private readonly IAssemblyInfoService _assemblyInfoService;
public YourControllerOrService(IAssemblyInfoService assemblyInfoService)
{
_assemblyInfoService = assemblyInfoService;
}
public List<string> InspectionType { get; private set; }
public void OnGet()
{
var productName = _assemblyInfoService.GetProductName();
var version = _assemblyInfoService.GetVersion();
var company = _assemblyInfoService.GetCompany();
}
Выход:
Примечание. Пожалуйста, обратитесь к этому официальному документу, чтобы проверить, какую информацию вы можете получить или что вам нужно.
Сборка НЕ работала (недоступна) в случае опубликованной версии (я добавил ее еще раз в общий вопрос)
Спасибо за ваш ответ, могу ли я узнать, есть ли у вас какие-либо ошибки или что-то в этом роде?
Я добавил "P.P.S." в общем вопрос
Похоже, это работает
var version = FileVersionInfo.GetVersionInfo(Environment.GetCommandLineArgs()[0]);
или
var version = FileVersionInfo.GetVersionInfo(Environment.ProcessPath);
Найдено в этой статье https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file/overview?tabs=vs#api-incompatibility
Используя
Reflection
, а затемAssembly
, мы можем получить эту информацию. Если бы вы могли создать для этого сервис, то, я думаю, вы могли бы получить название версии поGetName().Version.ToString()
, а для названия продукта вы можете написатьassembly.GetName().Name
, а для названия компании вы могли бы написатьAssemblyCompanyAttribute)Attribute.GetCustomAttribute(_assembly, typeof(AssemblyCompanyAttribute)
, а затем напрямую извлечьattribute.Company