GetExecutingAssembly() для производного класса в разных сборках

У меня есть плагиновую архитектуру, в которой базовый класс абстрактных определяется в основном приложении. Он использует отражение для загрузки сборок, которые получили реализации базового класса. Я хотел бы получить информацию о версии сборки, которая содержит производный объект. Вот мой базовый класс:

namespace My.AppNameSpace
{
    public abstract class BaseClass
    {
        public Version Version
        {
            get
            {
                Assembly assembly = Assembly.GetExecutingAssembly();
                FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
                string version = fvi.FileVersion;
                return new Version(version);
            }
        }

        public abstract void DoStuff();
    }
}

Поскольку базовый класс является частью основной сборки приложения, это всегда возвращает информацию о версии исполняемого приложения, а не DLL, которая содержит реализацию производного класса. Я могу изменить аксессуар версии как abstract, и он работает так, как мне хотелось бы. Но тогда мне нужно добавить те же самые несколько строк кода для каждого внедряющего модуля.

Есть ли какой-то трюк для получения информации о версии производного объекта из кода в базовом классе, который существует в отдельной сборке?

Ответ 1

Используйте this.GetType().Assembly вместо этого.

Ответ 2

Если из вашего абстрактного класса вы вызываете this.GetType(), вы получите тип среды выполнения текущего класса. Оттуда вы можете получить свойство Assembly этого типа.

    public Version Version
    {
        get
        {
            Assembly assembly = this.GetType().Assembly;
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
            string version = fvi.FileVersion;
            return new Version(version);
        }
    }