Re[7]: Удобный способ внесения изменений в чужую C#-библиоте
От: Albeoris  
Дата: 14.05.16 13:01
Оценка: 22 (1)
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 не сможет корректно разрешить.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Отредактировано 14.05.2016 13:02 Albeoris . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.