Я пытаюсь создать динамическую сборку, используя Reflection & Emit в .NET. Я получаю сообщение об ошибке «Common Language Runtime обнаружил недопустимую программу». Я создал еще одну программу, которая имеет нужные мне функции, используя жестко запрограммированные типы. Функциональность, которую я пытаюсь написать, в конечном итоге будет использовать динамические типы, но я могу использовать ILDasm, чтобы увидеть IL, который мне нужно сгенерировать. Я сравниваю IL, который я генерирую, с IL, который генерирует компилятор. В объявлении инициализации .locals одного метода я вижу дополнительный элемент в коде, сгенерированном компилятором,
сгенерированный компилятором:
.locals init ([0] class [System.Core]System.Linq.Expressions.ParameterExpression CS$0$0000,
[1] class [System.Core]System.Linq.Expressions.ParameterExpression[] CS$0$0001)
мой:
.locals init (class [System.Core]System.Linq.Expressions.ParameterExpression V_0,
class [System.Core]System.Linq.Expressions.ParameterExpression[] V_1)
Я не понимаю значения «[0]» и «[1]» в коде, сгенерированном компилятором. Кто-нибудь может сказать мне, что это значит?
Что касается более общего вопроса, я могу без особых проблем следить за большинством выводов ILDasm. Но время от времени я сталкиваюсь с проблемным выражением. Например, в этой строке из ILDasm
callvirt instance class [EntityFramework]System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1<!!0> [EntityFramework]System.Data.Entity.DbModelBuilder::Entity<class DynamicEdmxTrial.HardFooAsset>()
«!!0», вероятно, относится к общему типу Entity‹>, но я не знаю наверняка, и мне интересно, есть ли ключ к выводу ILDasm, который объяснил бы мне его более неясный вывод.
.locals
? Оба от ILDasm? - person svick   schedule 23.09.2013