在不同程序集中的派生类中使用GetExecutingAssembly()方法

15

我有一个插件架构,在主应用程序中定义了一个抽象基类。它使用反射来加载包含派生实现的程序集。我想获取包含派生对象的程序集的版本信息。这是我的基类:

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的版本信息。我可以将Version访问器更改为abstract,这样就像我想要的那样工作了。但是然后我需要将这些相同的几行代码添加到每个实现插件中。

是否有什么技巧可以从存在于单独程序集中的基类代码中获取派生对象的版本信息?

2个回答

31

请使用this.GetType().Assembly代替。


面对掌声,我需要休息一下。 - Phil Cooper

8
如果您从抽象类中调用 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);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接