GetExecutingAssembly()用于不同程序集中的派生类

时间:2014-04-08 15:36:01

标签: c# .net reflection .net-assembly

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

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,它可以按照我的意愿运行。但是我需要在每个实现插件中添加相同的几行代码。

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

2 个答案:

答案 0 :(得分:24)

改为使用this.GetType().Assembly

答案 1 :(得分: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);
        }
    }