xeno_by (xeno_by) wrote,
xeno_by
xeno_by

Reflection.Emit и многомерные массивы

После трех дней попыток побороть рефлекшн.эмит (см. заметки о баге, его соседях и попытке пофиксить), я могу сказать только одно - не надо даже пробовать юзать MD-массивы и Reflection.Emit. То есть, реф.эмитом не стоит даже и пытаться: эмиттить ссылки на филды, проперти, методы, что угодно, где есть хоть какое-то упоминание о многомерных массивах.

Даже если быть вооруженным пониманием причины проблемы и думать "ай, ну здесь-то точно не будет косяков, попробую-ка я вот так", то все равно можно натолкнуться на безумные проявления бага. Например: 1) неработающий override, 2) падающий BadImageFormatException там, где все мембер-рефы заэмиччены правильно, а также мой любимый: 3) Object::ToString, сваливающийся с наллрефом. Все это, конечно, логично - в случае #1 CLR не находит перекрывающий метод, в случае #2 неверный токен таки-просочился в метадату, а в случае #3 дефолтный ToString юзает GetType().Name, а геттайп возвращает null, ибо не может зарезолвить тип. Но сходу такие баги отловить почти невозможно - ибо они нарушают привычные представления о том, как работает фреймворк.

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

Причина адского бага
Tags: dotnet
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments