Информация об изменениях

Сообщение Re[7]: Удобный способ внесения изменений в чужую C#-библиоте от 14.05.2016 13:01

Изменено 14.05.2016 13:02 Albeoris

A>Заключительная версия, которая заменяет ссылки на старый тип новыми.
A>Неполная (отсутствует поддержка исключений, атрибутов). Но в моём сценарии пока работает. Буду допиливать по мере необходимости.
A>---
A>Обновил — добавил поддержку массивов.
A>---
A>Обновил — добавил поддержку Generic'ов.
A>---
A>Внимание: Перед заменой типа нужно заменить все его публичные вложенные (Nested) типы. Вложенные типы нужно импортировать, но не экспортировать!

Сейчас воткнулся в одно не слишком очевидное место в Mono.Cecil.
В случае вложенных типов, правильный алгоритм замены следующий:
1) Импортируем замещающий родительский тип.
2) Импортируем замещающий вложенный тип.
3) Заменяем ссылки на вложенный тип в исходной сборке.
4) Заменяем ссылки на вложенный тип в исходной сборке.
5) НЕ УДАЛЯЕМ вложенный тип.
6) НЕ ЭКСПОРТИРУЕМ вложенный тип.
7) Удаляем родительский тип.
8) Экспортируем родительский тип.

В противном случае, мы получим ошибку — BadImageFormatException: Duplicate type with name "...", так как ссылки на вложенный тип всегда идут через его экспортированного родителя, но явный экспорт вложенного типа создаст две ссылки на него, который CLR не сможет корректно разрешить.
Re[7]: Удобный способ внесения изменений в чужую C#-библиоте
A>Заключительная версия, которая заменяет ссылки на старый тип новыми.
A>Неполная (отсутствует поддержка исключений, атрибутов). Но в моём сценарии пока работает. Буду допиливать по мере необходимости.
A>---
A>Обновил — добавил поддержку массивов.
A>---
A>Обновил — добавил поддержку Generic'ов.
A>---
A>Внимание: Перед заменой типа нужно заменить все его публичные вложенные (Nested) типы. Вложенные типы нужно импортировать, но не экспортировать!

Сейчас воткнулся в одно не слишком очевидное место в Mono.Cecil.
В случае вложенных типов, правильный алгоритм замены следующий:
1) Импортируем замещающий родительский тип.
2) Импортируем замещающий вложенный тип.
3) Заменяем ссылки на вложенный тип в исходной сборке.
4) Заменяем ссылки на родительский тип в исходной сборке.
5) НЕ УДАЛЯЕМ вложенный тип.
6) НЕ ЭКСПОРТИРУЕМ вложенный тип.
7) Удаляем родительский тип.
8) Экспортируем родительский тип.

В противном случае, мы получим ошибку — BadImageFormatException: Duplicate type with name "...", так как ссылки на вложенный тип всегда идут через его экспортированного родителя, но явный экспорт вложенного типа создаст две ссылки на него, который CLR не сможет корректно разрешить.