Я только что видел подобную проблему, когда некоторые лямбда-выражения используются в представлениях, что приводит к повреждению DLL-библиотеки .Net при компиляции в 64-битной системе. Это приводит к тому же исключению, которое вы видите, и, безусловно, звучит как вероятный кандидат.
Извинения, если это кажется немного расплывчатым, поскольку мы не полностью решили это и все еще изучаем, хотя я обязательно обновлю здесь, когда у нас будет разрешение.
След, который заставляет нас поверить, что это действительно поврежденная dll, заключается в том, что если вы просматриваете свой dll скомпилированного представления в ildasm.exe и изучаете фактический вызов метода с использованием lamda, вы получаете «[SIGNATURE ENDED PREMATURELY]» ошибка, показанная в ildasm. Рефлектор RedGate, однако, падает при попытке расширить метод.
В нашем случае ildasm выглядит так:
IL_029f: call class [System.Core]System.Linq.Expressions.Expression`1<!!0> [System.Core]System.Linq.Expressions.Expression::Lambda<class [System.Core]System.Func`2<class [MyCode.Authentication.Admin.Mvc]MyCode.Authentication.Admin.Mvc.Dto.InternalUserDto,object>>(class [System.Core]System.Linq.Expressions.Expression, class [System.Core]System.Linq.Expressions.ParameterExpression[])
IL_02a4: call class [System.Web.Mvc]System.Web.Mvc.HtmlHelper [MyCode.Extensions]MyCode.Extensions.System.Web.Mvc.HtmlHelperInputExtensions::CheckBox<[2]>(class [System.Core]System.Linq.Expressions.Expression`1<class [System.Core]System.Func`2<class [MyCode.Extensions]'type parameter'.T,object>> [SIGNATURE ENDED PREMATURELY])
Мы заметили, что это только 64-битная проблема. Мы собираемся выяснить, по-прежнему ли эта проблема возникает в .Net 4.0. Я буду обновлять здесь, когда мы узнаем.
Мы также находимся в процессе выяснения, было ли это поднято как ошибка в Microsoft. Опять же, я обновлю здесь, когда мы узнаем.
[РЕДАКТИРОВАТЬ: теперь доходит до основной причины проблемы]
Я думал, что вернусь и обновлю этот ответ.
Для нас оказалось, что это вообще не проблема компилятора, а проблема с aspnet_merge. Короче говоря, на наших 64-битных сборочных блоках мы использовали более старую, устаревшую копию aspnet_merge (случайно), которая, казалось, работала, но привела к этим поврежденным dll (именно так, как вы описываете). Путь был изменен, поэтому наш проект веб-развертывания использовал эту неправильную версию.
Обновление пути к aspnet_merge версии 3.5 или выше исправило проблему.
Мы изначально думали, что это 64-битная проблема, потому что наши блоки сборки были единственной 64-битной средой, на которой мы скомпилировали (все наши рабочие станции 32-битные), и единственной, которая имела эту проблему. Тем не менее, «битность» была красной селедкой!
Надеюсь, это поможет вам решить вашу проблему.