xeno_by (xeno_by) wrote,
xeno_by
xeno_by

Кошмар продолжается

Не успел я поборот баг, описанный в соседнем посте, как наткнулся на связанный. Как было описано в том посте, проблема в том, что рефлекшн-эмит записывает сигнатуры, в которых участвуют многомерные массивы вот так (иллюстрация для двумерных массивов): T[..., ...], что отличается от того как это делает csc - T[0...,0...]. Оказывается, для рантайма эта небольшая разница оказывается очень значительной.

Конкретно моя проблема заключалась в том, что некорректно генерился MethodRef, и поэтому из рефлекшн-эмита я не мог вызвать методы, имеющие в своей сигнатуре параметр/ретурн многомерного типа. Задавив трабл воркараундом, я, к сожалению, не додумался до того, что этот воркараунд не имеет смысла, ибо есть еще куча непокрытых важных для меня случаев, где этот баг проявится. Например, в попытке перекрыть метод, у которого есть сигнатура с многомерным массивом. Фак. Пора пускать в ход тяжелую артиллерию...

P.S. Год назад этот баг уже засабмиттили в Майкрософт: http://support.microsoft.com/kb/960240. Вот что пишут по этому поводу из Редмонда: "Microsoft has recognized this problem, and it is currently planned that a future release of the .NET Framework will include a System.Reflection.Emit namespace that will have corrected this. Avoid using multidimensional arrays in classes where this anomaly might be a problem for you."
Tags: dotnet
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 4 comments