代码之家  ›  专栏  ›  技术社区  ›  Sam Harwell

为什么“assembly”和“module”没有公开定义的构造函数?

  •  2
  • Sam Harwell  · 技术社区  · 15 年前

    我正在C中构建一个.NET程序集加载程序,以进行“实验”/了解有关.NET内部操作的更多信息。我通过派生以下类型实现了反射API:

    • 运行时类型:类型
    • 运行时间字段信息:字段信息
    • 运行时方法信息:方法信息
    • 运行时参数信息:参数信息
    • runtimeconstructorinfo:constructorinfo
    • 运行时属性信息:属性信息

    不幸的是,我遇到了问题,因为下面没有可公开访问的构造函数,因此我无法从中派生:

    • 程序集(未密封-程序集生成器是从内部派生的)
    • 模块(未密封-模块生成程序是从内部派生的)

    我需要些东西回来 RuntimeType.get_Assembly RuntimeType.get_Module . 建议?发挥创造力-我必须这么做。)为了创造 RuntimeTypeHandle 例如,一些不安全的指针转换可以完成任务,但在这里并不容易。

    顺便说一下:现在的特别问题是我正在尝试为加载的类型漂亮地打印IL。对于构造的泛型, Type.FullName 属性通过 AssemblyQualifiedName 属性,而该属性又依赖于 Assembly 财产。

    1 回复  |  直到 15 年前
        1
  •  1
  •   JaredPar    15 年前

    你为什么不能从中得到?这两种类型(程序集和模块)都有一个受保护的构造函数,可供派生类型使用。类型本身是公共的,因此没有问题,它比实际的说明符更不可见。

    下面的代码编译得很好

    public class MyAssembly : System.Reflection.Assembly {
        public MyAssembly() : base() {}
    }
    

    为什么他们没有任何公共构造函数。我对此没有任何直接的了解,但很明显他们想强迫人们从这些课程中学习。考虑到他们没有抽象的成员,这似乎很奇怪。我唯一能想到的是一个版本控制问题,但背后没有逻辑在我脑海中闪现。

    编辑

    在我阅读280Z28的评论后,我检查了一下,是的,这是.NET 4.0的新功能。在4.0之前,组件和模块的构造函数都是内部的,两种类型都是具体的,但没有密封。因此,如果不使用完全可信的代码进行一些邪恶的操作,就不可能在4.0之前进行派生。