Есть ли простой способ импортировать класс (TypeDefinition) в другую сборку?

Я хочу импортировать новый класс в существующую сборку. Теперь мое решение:

  1. Сначала напишите этот класс и создайте его.

  2. Затем проверьте его IL-код в ILDASM.

  3. Создайте новые TypeDefinition, Method Definition и Instruction, а затем добавьте их в существующую сборку.

Это стоило бы мне много времени, так как я плохо разбираюсь в IL и Mono.cecil. ТАК интересно, есть ли простой способ импортировать TypeDefinition в другой?

var type = other_assembly.MainMoudle.Import(CLASS1).Reslove();
other_assembly.MainModule.Types.Add(type)

person KyleCTX    schedule 22.10.2014    source источник
comment
Вы хотите сделать это во время компиляции или во время выполнения? Ввоз временный или постоянный?   -  person CodeCaster    schedule 22.10.2014
comment
Постоянный. И время выполнения лучше @codecaster   -  person KyleCTX    schedule 22.10.2014


Ответы (1)


К сожалению, короткий ответ на простой способ — «Нет». Но есть надежда.

Проблема в том, что ссылки на исходный тип, скорее всего, разбросаны по сгенерированному IL для этого типа. Примером может служить установщик свойств, который обновляет значение частного поля. Поле, на которое ссылается этот установщик, — это поле, находящееся в исходном свойстве. На самом деле, даже установщик свойства для самого свойства является ссылкой на метод в исходном типе сборки.

Чтобы это работало, вам нужно просмотреть каждую ссылку в сгенерированной сборке (структуру, переменные, инструкции и т. д.), а те, которые ссылаются на себя, должны быть обновлены, чтобы вместо этого ссылаться на вновь созданный тип.

Я знаю, что это сложная проблема, потому что я написал код, который делает часть того, что вы ищете. Мой код фактически дополнительно копирует содержимое исходного типа в целевой тип, чтобы включить примеси в C#. Если вы потратите время на то, чтобы посмотреть, как работает код, вы можете изменить его. Вот несколько ссылок на код Bix.Mixers, которые могут оказаться полезными.

Проект: https://github.com/rileywhite/Bix.Mixers.Fody

Клон каркаса структуры: https://github.com/rileywhite/Bix.Mixers.Fody/blob/master/src/Bix.Mixers/Fody/ILCloning/ClonerGatheringVisitor.cs

Перенаправление ссылок с исходного на созданный тип (см. методы RootImport): https://github.com/rileywhite/Bix.Mixers.Fody/blob/master/src/Bix.Mixers/Fody/ILCloning/ILCloningContext.cs

person rileywhite    schedule 30.10.2014