Почему у `Assembly` и` Module` нет публично определенных конструкторов? - PullRequest
2 голосов
/ 02 августа 2009

Я собираю загрузчик сборок .NET на C # для «эксперимента» / изучения дополнительных внутренних операций .NET. Я реализовал API отражения, получив такие типы:

  • RuntimeType: Тип
  • RuntimeFieldInfo: FieldInfo
  • RuntimeMethodInfo: MethodInfo
  • RuntimeParameterInfo: ParameterInfo
  • RuntimeConstructorInfo: ConstructorInfo
  • RuntimePropertyInfo: PropertyInfo

К сожалению, у меня возникли проблемы, потому что следующие не имеют общедоступных конструкторов, поэтому я не могу извлечь из них:

  • Сборка (не запечатана - AssemblyBuilder является внутренним производным от нее)
  • Модуль (не запечатан - ModuleBuilder внутренне получен из него)

Мне нужно что-то, чтобы вернуться с RuntimeType.get_Assembly и RuntimeType.get_Module. Предложения? Проявить творческий подход - мне пришлось. ;) Для создания RuntimeTypeHandle экземпляров выполняется небезопасное приведение указателей, но здесь это не так просто.

Как отступление: особая проблема сейчас в том, что я пытаюсь красиво распечатать IL для загруженных типов. Для созданных обобщений свойство Type.FullName включает в себя обобщенные параметры через свойство AssemblyQualifiedName, которое, в свою очередь, опирается на свойство Assembly.

1 Ответ

1 голос
/ 02 августа 2009

Почему вы не можете извлечь из них? Оба типа (Сборка и Модуль) имеют защищенный конструктор, который будет доступен для вашего производного типа. Сами типы являются общедоступными, поэтому нет проблем с тем, чтобы он был менее видимым, чем фактический спецификатор.

Следующий код компилируется просто отлично

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

Что касается того, почему у них нет публичных конструкторов. Я не имею непосредственного знания об этом, но кажется ясным, что они хотели заставить людей извлекать уроки из этих классов. Это кажется странным, учитывая, что у них нет абстрактных членов. Единственное, о чем я могу думать, - это проблема версий, но никакая логика, которая стоит за этим, сейчас не приходит мне в голову.

EDIT

После того, как я прочитал комментарий 280Z28, я проверил, и да, это ново для .Net 4.0. До 4.0 конструктор для сборки и модуля был внутренним, и оба типа были бетонными, но не герметичными. Таким образом, вывод до версии 4.0 невозможен без каких-либо пороков с полностью доверенным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...