Как получить данные проекта (продукт, версия) для опубликованного выпуска в сети 6

Трудно получить данные проекта (продукт, версию), если проект был собран как опубликованный выпуск (в 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, а затем Assembly, мы можем получить эту информацию. Если бы вы могли создать для этого сервис, то, я думаю, вы могли бы получить название версии по GetName().Version.ToString(), а для названия продукта вы можете написать assembly.GetName().Name, а для названия компании вы могли бы написать AssemblyCompanyAttribute)Attribute.GetCustomAttribute(_assem‌​bly, typeof(AssemblyCompanyAttribute), а затем напрямую извлечь attribute.Company

Md Farid Uddin Kiron 30.04.2024 10:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

но таким образом я могу получить только версию, а не другие атрибуты проекта (Компания, Продукт). Как я могу получить все данные проекта? Может быть, нужно что-то настроить публикацию?

Ну, по вашему описанию и сценарию, возможно, вы слышали о Рефлексия. В 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();
}

Выход:

Примечание. Пожалуйста, обратитесь к этому официальному документу, чтобы проверить, какую информацию вы можете получить или что вам нужно.

Сборка НЕ ​​работала (недоступна) в случае опубликованной версии (я добавил ее еще раз в общий вопрос)

Fedor Yudin 30.04.2024 14:06

Спасибо за ваш ответ, могу ли я узнать, есть ли у вас какие-либо ошибки или что-то в этом роде?

Md Farid Uddin Kiron 30.04.2024 14:36

Я добавил "P.P.S." в общем вопрос

Fedor Yudin 30.04.2024 15:25
Ответ принят как подходящий

Похоже, это работает

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

Другие вопросы по теме