Я пишу специальный мини-компилятор, и я часто рассматриваю разобранный CIL, чтобы выяснить, как это делать. Но часто неясно, как перевести дизассемблированный код на вызовы Reflection.Emit. Существует ли справочное руководство или какой-либо другой источник информации для этого перевода?В общем, как преобразовать синтаксис ilasm в Reflection.Emit calls?
Редактировать: да, сопоставление опкодов с ILGenerator довольно просто; Я говорю обо всех других вещах, таких как директивы и атрибуты. Например, как вы узнаете, как написать Reflection.Emit эквивалент чего-то вроде Dictionary<TKey,TValue>
?
.class public auto ansi serializable beforefieldinit Dictionary<TKey, TValue>
extends System.Object
implements System.Collections.Generic.IDictionary`2<!TKey, !TValue>,
System.Collections.Generic.ICollection`1<valuetype
System.Collections.Generic.KeyValuePair`2<!TKey, !TValue>>,
...
{
.custom instance void System.Diagnostics.DebuggerDisplayAttribute::
.ctor(string) = { string('Count = {Count}') }
.method public hidebysig newslot virtual final instance bool TryGetValue
(!TKey key, [out] !TValue& 'value') cil managed
{
.maxstack 3
.locals init ([0] int32 num)
...
Или как насчет директивы «param»?
// public static void SayHello(string s = "Hello World!")
.method public hidebysig static void SayHello([opt] string s) cil managed
{
.param [1] = "Hello World!"
Не является ли класс OpCodes сопоставлением один к одному? http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.aspx –
В зависимости от того, что вы делаете, гораздо проще использовать деревья выражений, которые затем можно скомпилировать в CIL : http://msdn.microsoft.com/en-us/library/bb397951.aspx – porges
Деревья выражений касаются главным образом выражений здания, а не создания метаданных классов и методов. Я задал этот вопрос, потому что хочу знать, как его создать. (Я еще не использую .NET 4, но я слышал, что деревья выражений несколько расширились в .NET 4). – Qwertie