【问题标题】:Why do `Assembly` and `Module` have no publicly defined constructors?为什么 `Assembly` 和 `Module` 没有公开定义的构造函数?
【发布时间】:2010-11-16 02:11:45
【问题描述】:

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

  • RuntimeType : 类型
  • RuntimeFieldInfo : FieldInfo
  • RuntimeMethodInfo : MethodInfo
  • 运行时参数信息:参数信息
  • RuntimeConstructorInfo : ConstructorInfo
  • RuntimePropertyInfo : PropertyInfo

不幸的是,我遇到了麻烦,因为以下没有可公开访问的构造函数,所以我无法从它们派生:

  • 程序集(未密封 - AssemblyBuilder 内部派生自它)
  • 模块(未密封 - ModuleBuilder 内部派生自它)

我需要从RuntimeType.get_AssemblyRuntimeType.get_Module 返回一些东西。建议?发挥创意——我不得不这样做。 ;) 对于创建 RuntimeTypeHandle 实例,一些不安全的指针转换可以完成工作,但在这里并不那么容易。

顺便说一句:现在特别麻烦的是我正在尝试为加载的类型漂亮地打印 IL。对于构造的泛型,Type.FullName 属性通过AssemblyQualifiedName 属性包含泛型参数,而后者又依赖于Assembly 属性。

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    为什么你不能从他们那里得到?这两种类型(Assembly 和 Module)都有一个受保护的构造函数,可用于您的派生类型。类型本身是公共的,因此它比实际说明符更不可见是没有问题的。

    下面的代码编译得很好

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

    至于为什么他们没有任何公共构造函数。我对此没有任何直接的了解,但很明显他们想强迫人们从这些类中派生。考虑到它们没有抽象成员,这看起来确实很奇怪。我唯一能想到的是版本控制问题,但我现在没有想到背后的逻辑。

    编辑

    阅读 280Z28 的评论后,我检查了一下,是的,这是 .Net 4.0 的新内容。在 4.0 之前,Assembly 和 Module 的构造函数都是内部的,两种类型都是具体的,但不是密封的。因此,如果不使用完全受信任的代码做一些坏事,那么在 4.0 之前的推导是不可能的。

    【讨论】:

    • 如果是这种情况,那么它要么是 .NET 4 的新内容,要么是 .NET 2 之后删除的。
    • 此外,对于许多类型,.NET Framework 实现确实 派生自该类型。但是,对于 AssemblyModule 类型,它们按原样使用。
    • @280Z28,我刚刚检查过,是的,它是 .Net 4.0 的新手。
    • 是的,Assembly 在 .NET 4 中是抽象的。看起来很明显我的项目需要 .NET 4,除了我没有它的明显问题。 :(
    • 我不喜欢这个答案,但我会给你。 :\ 现在要弄清楚如何从 VS08 定位 .NET 4...
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多