为什么`Assembly`和`Module`没有公开定义的构造函数?

时间:2009-08-01 20:53:15

标签: c# .net reflection

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

  • 运行时类型:输入
  • RuntimeFieldInfo:FieldInfo
  • RuntimeMethodInfo:MethodInfo
  • RuntimeParameterInfo:ParameterInfo
  • RuntimeConstructorInfo:ConstructorInfo
  • RuntimePropertyInfo:PropertyInfo

不幸的是我遇到了麻烦,因为以下没有可公开访问的构造函数,因此我无法从中获取:

  • 装配(未密封 - AssemblyBuilder内部派生自它)
  • 模块(未密封 - ModuleBuilder内部派生自它)

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

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

1 个答案:

答案 0 :(得分:1)

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

以下代码编译得很好

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

至于为什么他们没有任何公共建设者。我对此没有任何直接的了解,但似乎很明显他们想要迫使人们从这些课程中获得。考虑到他们没有抽象成员,这似乎很奇怪。我唯一能想到的是版本问题,但现在没有任何逻辑可以跳到我的脑海。

修改

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