{"id":261552,"date":"2015-07-15T18:55:02","date_gmt":"2015-07-15T14:55:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=261552"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=261552","title":{"rendered":"\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f IL"},"content":{"rendered":"<p>             \u042f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-specific_language\" title=\"Domain Specific Language\">DSL<\/a>). \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043b\u0443\u0447\u0448\u0438\u0439 \u2013 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e <font color=\"00008b\">Reflection.Emit<\/font> \u0438 CIL (Common Intermediate Language) \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0438: \u0443\u043c\u043d\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0435 \u043d\u0430\u0434 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.reflection.emit.ilgenerator.aspx\" title=\"ILGenerator\">ILGenerator<\/a> \u2013 <font color=\"00008b\">GroboIL<\/font> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/homuroll\/gremit\" title=\"Graceful Emit\">Graceful Emit<\/a>.<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c, \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IL. \u041a\u0441\u0442\u0430\u0442\u0438, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 <a href=\"https:\/\/code.google.com\/p\/protobuf-net\/\" title=\"protobuf-net\">protobuf-net<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d IL-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c IL-\u043a\u043e\u0434\u0430, \u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c IL. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"http:\/\/www.codeproject.com\/Articles\/3778\/Introduction-to-IL-Assembly-Language\" title=\"Introduction to IL Assembly Language\">Introduction to IL Assembly Language<\/a>.<br \/>  <a name=\"habracut\"><\/a><br \/>  <font color=\"00008b\">Reflection.Emit<\/font> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u2013 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.reflection.emit.dynamicmethod.aspx\" title=\"DynamicMethod\">DynamicMethod<\/a> \u0438 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.reflection.emit.typebuilder.aspx\" title=\"TypeBuilder\">TypeBuilder<\/a>\/<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.reflection.emit.methodbuilder.aspx\" title=\"MethodBuilder\">MethodBuilder<\/a>.<\/p>\n<p>  <font color=\"00008b\">DynamicMethod<\/font> \u2013 \u044d\u0442\u043e \u00ab\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439\u00bb \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <font color=\"00008b\">DynamicMethod<\/font>&#8216;\u0430\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0447\u043b\u0435\u043d\u043e\u0432 \u0442\u0438\u043f\u043e\u0432. \u041e\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b, \u043d\u043e \u0441 .NET Framework 4.0 \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438 \u0443 <font color=\"00008b\">DynamicAssembly<\/font>, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <font color=\"00008b\">DynamicAssembly<\/font>\/<font color=\"00008b\">ModuleBuilder<\/font>\/<font color=\"00008b\">TypeBuilder<\/font>\/<font color=\"00008b\">MethodBuilder<\/font> \u043c\u043e\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 .NET: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044f, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u0442. \u0434. \u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0430\u044f assembly, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a.<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <font color=\"00008b\">DynamicMethod<\/font>&#8216;\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0449\u0435 \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0447\u043b\u0435\u043d\u0430\u043c. <font color=\"00008b\">MethodBuilder<\/font>&#8216;\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435: \u0442\u043e\u0433\u0434\u0430 \u0438\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 <font color=\"00008b\">TypeBuilder<\/font>&#8216;\u044b, \u0430 \u043a\u043e\u0434 \u2013 \u0432 \u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440<\/h2>\n<p>  \u0417\u0430\u0434\u0430\u0447\u0430: \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"cs\">public static Action&lt;T&gt; BuildFieldsPrinter&lt;T&gt;() where T : class {    var type = typeof(T);    var method = new DynamicMethod(Guid.NewGuid().ToString(), \/\/ \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430                                   typeof(void), \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f                                   new[] {type}, \/\/ \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b                                   typeof(string), \/\/ \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, string                                   true); \/\/ \u043f\u0440\u043e\u0441\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c    var il = method.GetILGenerator();    var fieldValue = il.DeclareLocal(typeof(object));    var toStringMethod = typeof(object).GetMethod(&quot;ToString&quot;);    var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);    foreach(var field in fields)    {        il.Emit(OpCodes.Ldstr, field.Name + &quot;: {0}&quot;); \/\/ stack: [format]        il.Emit(OpCodes.Ldarg_0); \/\/ stack: [format, obj]        il.Emit(OpCodes.Ldfld, field); \/\/ stack: [format, obj.field]        if(field.FieldType.IsValueType)             il.Emit(OpCodes.Box, field.FieldType); \/\/ stack: [format, (object)obj.field]        il.Emit(OpCodes.Dup); \/\/ stack: [format, obj.field, obj.field]        il.Emit(OpCodes.Stloc, fieldValue); \/\/ fieldValue = obj.field; stack: [format, obj.field]        var notNullLabel = il.DefineLabel();        il.Emit(OpCodes.Brtrue, notNullLabel); \/\/ if(obj.field != null) goto notNull; stack: [format]        il.Emit(OpCodes.Ldstr, &quot;null&quot;); \/\/ stack: [format, &quot;null&quot;]        var printedLabel = il.DefineLabel();        il.Emit(OpCodes.Br, printedLabel); \/\/ goto printed        il.MarkLabel(notNullLabel);        il.Emit(OpCodes.Ldloc, fieldValue); \/\/ stack: [format, obj.field]        il.EmitCall(OpCodes.Callvirt, toStringMethod, null); \/\/ stack: [format, obj.field.ToString()]        il.MarkLabel(printedLabel);        var writeLineMethod = typeof(Console).GetMethod(&quot;WriteLine&quot;, new[] { typeof(string), typeof(object) });        il.EmitCall(OpCodes.Call, writeLineMethod, null); \/\/ Console.WriteLine(format, obj.field.ToString()); stack: []    }    il.Emit(OpCodes.Ret);    return (Action&lt;T&gt;)method.CreateDelegate(typeof(Action&lt;T&gt;)); } <\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b <font color=\"00008b\">ILGenerator<\/font><\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 <font color=\"00008b\">ILGenerator<\/font>&#8216;\u0430 \u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441: \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 <font color=\"008b8b\">Emit<\/font> \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u0443 \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 IL-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <font color=\"0000ff\">ldelem<\/font> \u0435\u0441\u0442\u044c 11 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u2013 <font color=\"0000ff\">ldelem.i1<\/font> (sbyte), <font color=\"0000ff\">ldelem.i2<\/font> (short), <font color=\"0000ff\">ldelem.i4<\/font> (int), <font color=\"0000ff\">ldelem.i8<\/font> (long), <font color=\"0000ff\">ldelem.u1<\/font> (byte), <font color=\"0000ff\">ldelem.u2<\/font> (ushort), <font color=\"0000ff\">ldelem.u4<\/font> (uint), <font color=\"0000ff\">ldelem.r4<\/font> (float), <font color=\"0000ff\">ldelem.r8<\/font> (double), <font color=\"0000ff\">ldelem.i<\/font> (native int), <font color=\"0000ff\">ldelem.ref<\/font> (reference type).<\/p>\n<p>  \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u043c\u0435\u0447\u043a\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0435\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u043e\u0445\u043e \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c (\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0435 <font color=\"00008b\">DynamicMethod<\/font>.<font color=\"008b8b\">CreateDelegate<\/font>() \u0438\u043b\u0438 <font color=\"00008b\">TypeBuilder<\/font>.<font color=\"008b8b\">CreateType<\/font>(), \u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0438 \u043e \u0447\u0435\u043c \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0441\u0430\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2013 \u00abCommon language runtime detected an invalid program\u00bb.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0448\u0438\u0431\u043e\u043a\/\u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a<\/h3>\n<p>  <\/p>\n<ol>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 il.Emit(OpCodes.Ldfld); \/\/ \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u0435, \u043d\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c FieldInfo {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  InvalidProgramException: \u00abCommon language runtime detected an invalid program\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 il.Emit(OpCodes.Box); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0441\u043a\u0430\u0441\u0442\u043e\u0432\u0430\u0442\u044c value type \u043a object, \u043d\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0438\u043f {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  InvalidProgramException: \u00abCommon language runtime detected an invalid program\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var code = GetCode(..); \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 byte il.Emit(OpCodes.Ldc_I4, code); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0442\u0438\u043f\u0430 int, \u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 byte {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  InvalidProgramException: \u00abCommon language runtime detected an invalid program\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 il.Emit(OpCodes.Call, abstractMethod); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e Callvirt \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 Call {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  BadImageFormatException: \u00abInvalid il format\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var keyGetter = typeof(KeyValuePair&lt;int, int&gt;).GetProperty(&quot;Key&quot;).GetGetMethod(); il.Emit(OpCodes.Ldarg_1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 KeyValuePair&lt;int, int&gt; il.Emit(OpCodes.Call, keyGetter); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e Key \u0443 KeyValuePair&lt;int, int&gt;, \u043d\u043e \u044d\u0442\u043e value type,                                   \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  InvalidProgramException: \u00abCommon language runtime detected an invalid program\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var toStringMethod = typeof(object).GetMethod(&quot;ToString&quot;); il.Emit(OpCodes.Ldarga, 1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 int, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 il.Emit(OpCodes.Callvirt, toStringMethod); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c int.ToString(), \u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430                                            \/\/ \u043d\u0430 value type \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u0435\u0444\u0438\u043a\u0441 constrained {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  NullReferenceException: \u00abObject reference not set to instance of an object\u00bb.<br \/>  \u0418\u043b\u0438<br \/>  AccessViolationException: \u00abAttempted to read or write protected memory. This is often an indication that other memory is corrupt\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; \/\/ \u0425\u043e\u0442\u0438\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 value var valueField = typeof(KeyValuePair&lt;int, string&gt;).GetField(&quot;value&quot;, bindingFlags); il.Emit(OpCodes.Ldarga, 1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 KeyValuePair&lt;string, int&gt; il.Emit(OpCodes.Ldfld, valueField); \/\/ \u0425\u043e\u0442\u0435\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u043e\u043b\u0435 value \u0443 KeyValuePair&lt;string, int&gt;, \u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e                                     \/\/ KeyValuePair&lt;string, int&gt; \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 KeyValuePair&lt;int, string&gt;, \u0432 \u0438\u0442\u043e\u0433\u0435                                     \/\/ \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u043e\u043b\u0435 key \u0442\u0438\u043f\u0430 int \u0438 \u043f\u0440\u043e\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a string {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 var compiledMethod = dynamicMethod.CreateDelegate(..); var result = compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f {..} \/\/ \u041a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 result \u2190 \u0411\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  \u041d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 AccessViolationException \u0438\u043b\u0438 NullReferenceException.<\/p>\n<\/li>\n<li>\u0417\u0430\u0431\u044b\u043b\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0434\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Ret<\/font> \u2013 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043c\u043e\u0436\u0435\u0442, \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0435 \u0441\u043b\u043e\u043c\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u0435\u0437\u0442\u0438 \u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\n<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e\n<pre><code class=\"cs\">static int Add(int x, double y) { return x + (int)y; }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); \til.Emit(OpCodes.Ldarg_0); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 0 - \u0442\u0438\u043f\u0430 int \til.Emit(OpCodes.Ldarg_1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 - \u0442\u0438\u043f\u0430 double \til.Emit(OpCodes.Add); \/\/ \u0417\u0430\u0431\u044b\u043b\u0438 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c double \u043a int. \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \til.Emit(OpCodes.Ret); var compiledMethod = dynamicMethod.CreateDelegate(..); var result = compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <\/code><\/pre>\n<p>  \u0412 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 CIL \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Add<\/font> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0438\u043f\u043e\u0432 <font color=\"0000ff\">int<\/font> \u0438 <font color=\"0000ff\">double<\/font>, \u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0435\u0435 \u043e\u0442 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:  <\/p>\n<ul>\n<li>x64: compiledMethod(10, 3.14) = 13<br \/>  ASM-\u043a\u043e\u0434 (x \u043b\u0435\u0436\u0438\u0442 \u0432 <font color=\"9600ab\">ecx<\/font>, y \u2014 \u0432 <font color=\"008b8b\">xmm1<\/font>):<br \/>  <font color=\"0000ff\">cvtsi2sd<\/font> <font color=\"008b8b\">xmm0<\/font>, <font color=\"9600ab\">ecx<\/font><br \/>  <font color=\"0000ff\">addsd<\/font> <font color=\"008b8b\">xmm0<\/font>, <font color=\"008b8b\">xmm1<\/font><br \/>  <font color=\"0000ff\">cvttsd2si<\/font> <font color=\"9600ab\">eax<\/font>, <font color=\"008b8b\">xmm0<\/font>  <\/li>\n<li>x86: compiledMethod(10, 3.14) = 20<br \/>  ASM-\u043a\u043e\u0434 (x \u043b\u0435\u0436\u0438\u0442 \u0432 <font color=\"9600ab\">ecx<\/font>, y \u2014 \u043d\u0430 \u0441\u0442\u044d\u043a\u0435):<br \/>  <font color=\"0000ff\">mov<\/font> <font color=\"9600ab\">eax<\/font>, <font color=\"9600ab\">ecx<\/font><br \/>  <font color=\"0000ff\">fld<\/font> <font color=\"0000ff\">qword<\/font> [<font color=\"9600ab\">esp<\/font> + 4]<br \/>  <font color=\"0000ff\">add<\/font> <font color=\"9600ab\">eax<\/font>, <font color=\"9600ab\">ecx<\/font><br \/>  <font color=\"0000ff\">fstp<\/font> <font color=\"008b8b\">st<\/font>(0)  <\/li>\n<\/ul>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434 x64 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f (<font color=\"0000ff\">int<\/font> \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a <font color=\"0000ff\">double<\/font>, \u043f\u043e\u0442\u043e\u043c \u0434\u0432\u0430 <font color=\"0000ff\">double<\/font> \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e <font color=\"0000ff\">int<\/font>), \u0430 \u0432\u043e\u0442 \u043f\u043e\u0434 x86 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u043b\u0430 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e x + y \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f 2 * x (\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e <font color=\"0000ff\">int<\/font> + <font color=\"0000ff\">double<\/font> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <font color=\"0000ff\">double<\/font> + <font color=\"0000ff\">int<\/font>).<\/p>\n<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e\n<pre><code class=\"cs\">static string Coalesce(string str) { return str ?? &quot;&quot;; }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cs\">var il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); \/\/ stack: [str] il.Emit(OpCodes.Dup); \/\/ stack: [str, str] var notNullLabel = il.DefineLabel(); il.Emit(OpCodes.Brtrue, notNullLabel); \/\/ if(str != null) goto notNull; stack: [str] il.Emit(OpCodes.Ldstr, &quot;&quot;); \/\/ Oops, \u0437\u0430\u0431\u044b\u043b\u0438, \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u044d\u043a\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 str il.MarkLabel(notNullLabel); \/\/ \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u0442\u044d\u043a: \u0432 \u043d\u0435\u043c \u043b\u0438\u0431\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u0434\u0432\u0430 il.Emit(OpCodes.Ret); var compiledMethod = dynamicMethod.CreateDelegate(..); compiledMethod(..);  \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<p>  InvalidProgramException: \u00abJIT compiler encountered an internal limitation\u00bb.<\/p>\n<p>  \u0421\u044e\u0434\u0430 \u0436\u0435 \u043f\u043e\u0434\u043f\u0430\u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a: \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c <font color=\"0000ff\">this<\/font> \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 instance-\u043c\u0435\u0442\u043e\u0434\u0430, \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u043d\u0435 \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u0442. \u0434.  <\/li>\n<\/ol>\n<p>  \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0442\u043e \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e, \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0432 \u043a\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u0447\u0435\u043c \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043e\u0442\u0435\u043d \u043a\u043e\u043c\u0430\u043d\u0434, \u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u0443\u0442\u043e\u0440\u043d\u044b\u043c \u0438 \u0434\u043e\u043b\u0433\u0438\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0435\u043c.<br \/>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u0441\u0435 \u0436\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0434\u0435\u0431\u0430\u0433\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u044d\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0434\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u043e \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e, \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0438\u043c\u0435\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f IL-\u043a\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <font color=\"00008b\">ILGenerator<\/font> \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0438\u0437\u043c\u0443\u0447\u0438\u0432\u0448\u0438\u0441\u044c, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439, \u0443\u0447\u0442\u044f \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f.<br \/>  \u0417\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 IL-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 InvalidProgramException \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0431\u044b \u043d\u0435 \u0432\u044b\u043b\u0435\u0442\u0430\u043b\u043e, \u0430 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0433\u0434\u0435-\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<h2><font color=\"00008b\">GroboIL<\/font><\/h2>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0442\u0430\u043b <font color=\"00008b\">GroboIL<\/font> \u2013 \u0443\u043c\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <font color=\"00008b\">ILGenerator<\/font>.<\/p>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <font color=\"00008b\">GroboIL<\/font>:  <\/p>\n<ul>\n<li>\u0411\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441: \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u0441\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432\u043c\u0435\u0441\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e 11 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Ldelem_*<\/font> \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Ldelem<\/font>(<font color=\"00008b\">Type<\/font> type).  <\/li>\n<li>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 <font color=\"00008b\">GroboIL<\/font> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0438 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0442\u0443\u0442 \u0436\u0435 \u043a\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.  <\/li>\n<li>\u0415\u0441\u0442\u044c \u0434\u0435\u0431\u0430\u0433-\u0432\u044b\u0432\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430.  <\/li>\n<li>\u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0431\u0430\u0433\u0430 <font color=\"00008b\">MethodBuilder<\/font>&#8216;\u043e\u0432.  <\/li>\n<li>\u041f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a-\u0442\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 500 000 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043d\u044f\u043b\u0430 84 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u043e\u0442\u044a\u0435\u043b\u0430 4\u0413\u0411 \u043f\u0430\u043c\u044f\u0442\u0438).  <\/li>\n<\/ul>\n<p>  \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <font color=\"00008b\">GroboIL<\/font>:<\/p>\n<pre><code class=\"cs\">public static Action&lt;T&gt; BuildFieldsPrinter&lt;T&gt;() where T : class {    var type = typeof(T);    var method = new DynamicMethod(Guid.NewGuid().ToString(), \/\/ \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430                                   typeof(void), \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f                                   new[] { type }, \/\/ \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b                                   typeof(string), \/\/ \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, string                                   true); \/\/ \u043f\u0440\u043e\u0441\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c    using(var il = new GroboIL(method))    {        var fieldValue = il.DeclareLocal(typeof(object), &quot;fieldValue&quot;);        var toStringMethod = typeof(object).GetMethod(&quot;ToString&quot;);        var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);        foreach(var field in fields)        {            il.Ldstr(field.Name + &quot;: {0}&quot;); \/\/ stack: [format]            il.Ldarg(0); \/\/ stack: [format, obj]            il.Ldfld(field); \/\/ stack: [format, obj.field]            if(field.FieldType.IsValueType)                il.Box(field.FieldType); \/\/ stack: [format, (object)obj.field]            il.Dup(); \/\/ stack: [format, obj.field, obj.field]            il.Stloc(fieldValue); \/\/ fieldValue = obj.field; stack: [format, obj.field]            var notNullLabel = il.DefineLabel(&quot;notNull&quot;);            il.Brtrue(notNullLabel); \/\/ if(obj.field != null) goto notNull; stack: [format]            il.Ldstr(&quot;null&quot;); \/\/ stack: [format, &quot;null&quot;]            var printedLabel = il.DefineLabel(&quot;printed&quot;);            il.Br(printedLabel); \/\/ goto printed            il.MarkLabel(notNullLabel);            il.Ldloc(fieldValue); \/\/ stack: [format, obj.field]            il.Call(toStringMethod); \/\/ stack: [format, obj.field.ToString()]            il.MarkLabel(printedLabel);            var writeLineMethod = typeof(Console).GetMethod(&quot;WriteLine&quot;, new[] { typeof(string), typeof(object) });            il.Call(writeLineMethod); \/\/ Console.WriteLine(format, obj.field.ToString()); stack: []        }        il.Ret();    }    return (Action&lt;T&gt;)method.CreateDelegate(typeof(Action&lt;T&gt;)); } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441 <font color=\"00008b\">GroboIL<\/font>&#8216;\u043e\u043c.<\/p>\n<ol>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    il.Ldfld(); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Ldfld<\/font>() \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    il.Box(); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Box<\/font>() \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    var code = GetCode(..); \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 byte    il.Ldc_I4(code); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043e\u043a, \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442 int    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Ldc_I4<\/font>() \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <font color=\"0000ff\">int<\/font>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <font color=\"0000ff\">byte<\/font> \u0441\u043a\u0430\u0441\u0442\u0443\u0435\u0442\u0441\u044f \u043a <font color=\"0000ff\">int<\/font> \u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    il.Call(abstractMethod); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043e\u043a, \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f Callvirt    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Call<\/font>() \u044d\u043c\u0438\u0442\u0438\u0442 <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Call<\/font> \u0434\u043b\u044f \u043d\u0435\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Callvirt<\/font> \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">Callnonvirt<\/font>())<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    var keyGetter = typeof(KeyValuePair&lt;int, int&gt;).GetProperty(&quot;Key&quot;).GetGetMethod();    il.Ldarg(1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 KeyValuePair&lt;int, int&gt;    il.Call(keyGetter); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 value type:<br \/>  InvalidOperationException: \u00abIn order to call the method &#8216;String KeyValuePair&lt;Int32, String&gt;.get_Value()&#8217; on a value type &#8216;KeyValuePair&lt;Int32, String&gt;&#8217; load an instance by ref or box it\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    var toStringMethod = typeof(object).GetMethod(&quot;ToString&quot;);    il.Ldarga(1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 int, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443    il.Call(toStringMethod); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430 value type \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2018constrained\u2019 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Constrained<\/font>):<br \/>  InvalidOperationException: \u00abIn order to call a virtual method &#8216;String Object.ToString()&#8217; on a value type &#8216;KeyValuePair&lt;Int32, String&gt;&#8217; specify the &#8216;constrained&#8217; parameter\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438    var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; \/\/ \u0425\u043e\u0442\u0438\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 value    var valueField = typeof(KeyValuePair&lt;int, string&gt;).GetField(&quot;value&quot;, bindingFlags);    il.Ldarga(1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 \u2013 KeyValuePair&lt;string, int&gt;    il.Ldfld(valueField); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    {..} \/\/ \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 } <\/code><\/pre>\n<p>  \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u0435:<br \/>  InvalidOperationException: \u00abCannot load the field &#8216;KeyValuePair&lt;Int32, String&gt;.value&#8217; of an instance of type &#8216;KeyValuePair&lt;String, Int32&gt;&#8217;\u00bb.<\/p>\n<\/li>\n<li>\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Ret<\/font>.\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    il.Ldarg(0); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 0 - \u0442\u0438\u043f\u0430 int    il.Ldarg(1); \/\/ \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 1 - \u0442\u0438\u043f\u0430 double    il.Add(); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    il.Ret(); } <\/code><\/pre>\n<p>  \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <font color=\"00008b\">OpCodes<\/font>.<font color=\"9600ab\">Add<\/font> \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435:<br \/>  InvalidOperationException: \u00abCannot perform the instruction &#8216;add&#8217; on types &#8216;Int32&#8217; and &#8216;Double&#8217;\u00bb.<\/p>\n<\/li>\n<li> \n<pre><code class=\"cs\">using(var il = new GroboIL(dynamicMethod)) {    il.Ldarg(0); \/\/ stack: [str]    il.Dup(); \/\/ stack: [str, str]    var notNullLabel = il.DefineLabel(&quot;notNull&quot;);    il.Brtrue(notNullLabel); \/\/ if(str != null) goto notNull; stack: [str]    il.Ldstr(&quot;&quot;); \/\/ Oops, \u0437\u0430\u0431\u044b\u043b\u0438, \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u044d\u043a\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 str    il.MarkLabel(notNullLabel); \/\/ \u2190 \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    il.Ret(); } <\/code><\/pre>\n<p>  \u0412\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441\u0442\u044d\u043a\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u0434\u0432\u0430 \u043f\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u0441\u0442\u044d\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u044d\u043a\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<br \/>  InvalidOperationException: \u00abInconsistent stack for the label \u2018notNull\u2019<br \/>  Stack #1: [null, String]<br \/>  Stack #2: [String]\u00bb  <\/li>\n<\/ol>\n<h2>Debugging<\/h2>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, <font color=\"00008b\">GroboIL<\/font> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0431\u0430\u0433-\u0442\u0435\u043a\u0441\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e IL-\u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u044d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0432\u044b\u0437\u0432\u0430\u0432 <font color=\"00008b\">GroboIL<\/font>.<font color=\"008b8b\">GetILCode<\/font>(), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cs\">      ldarg.0          \/\/ [List&lt;T&gt;]      dup              \/\/ [List&lt;T&gt;, List&lt;T&gt;]      brtrue notNull_0 \/\/ [null]      pop              \/\/ []      ldc.i4.0         \/\/ [Int32]      newarr T         \/\/ [T[]] notNull_0:            \/\/ [{Object: IList, IList&lt;T&gt;, IReadOnlyList&lt;T&gt;}]      ldarg.1          \/\/ [{Object: IList, IList&lt;T&gt;, IReadOnlyList&lt;T&gt;}, Func&lt;T, Int32&gt;]      call Int32 Enumerable.Sum&lt;T&gt;(IEnumerable&lt;T&gt;, Func&lt;T, Int32&gt;)                       \/\/ [Int32]      ret              \/\/ [] <\/code><\/pre>\n<p>  \u041d\u0443 \u0438 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0431\u0430\u0433\u0430\u0442\u044c <font color=\"00008b\">MethodBuillder<\/font>&#8216;\u044b. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <font color=\"00008b\">GroboIL<\/font> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0433\u0434\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0434\u0435\u0431\u0430\u0433-\u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cs\">public abstract class Bazzze {    public abstract int Sum(int x, double y); }  public void Test() {    var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(                       new AssemblyName(&quot;DynAssembly&quot;),                       AssemblyBuilderAccess.RunAndCollect); \/\/ \u0425\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0441\u043e\u0431\u0440\u0430\u043b Assembly, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430    var module = assembly.DefineDynamicModule(&quot;zzz&quot;, &quot;zzz.dll&quot;, true); \/\/ true - \u0445\u043e\u0442\u0438\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e    var symWriter = module.GetSymWriter();    var typeBuilder = module.DefineType(&quot;Zzz&quot;, TypeAttributes.Public | TypeAttributes.Class, typeof(Bazzze));    var method = typeBuilder.DefineMethod(                     &quot;Sum&quot;,                     MethodAttributes.Public | MethodAttributes.Virtual, \/\/ \u0411\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430                     typeof(int), \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f                     new[] { typeof(int), typeof(double) }); \/\/ \u0422\u0438\u043f\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432    method.DefineParameter(1, ParameterAttributes.None, &quot;x&quot;); \/\/ \u041d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430    method.DefineParameter(2, ParameterAttributes.None, &quot;y&quot;); \/\/ \u042d\u0442\u0438 \u0438\u043c\u0435\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432 watch    var documentName = typeBuilder.Name + &quot;.&quot; + method.Name + &quot;.cil&quot;;    var documentWriter = symWriter.DefineDocument(documentName,                             SymDocumentType.Text, SymLanguageType.ILAssembly, Guid.Empty); \/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u044b\u0435 \u0433\u0443\u0438\u0434\u044b \u0441\u0442\u0430\u0432\u0438\u0442\u044c    using(var il = new GroboIL(method, documentWriter)) \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 documentWriter    {        il.Ldarg(1); \/\/ stack: [x]        il.Ldarg(2); \/\/ stack: [x, y]        il.Conv&lt;int&gt;(); \/\/ stack: [x, (int)y]        il.Dup(); \/\/ stack: [x, (int)y, (int)y]        var temp = il.DeclareLocal(typeof(int), &quot;temp&quot;);        il.Stloc(temp); \/\/ temp = (int)y; stack: [x, (int)y]        il.Add(); \/\/ stack: [x + (int)y]        il.Ret();         File.WriteAllText(Path.Combine(DebugOutputDirectory, documentName), il.GetILCode());    }    typeBuilder.DefineMethodOverride(method, typeof(Bazzze).GetMethod(&quot;Sum&quot;)); \/\/ \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434     var type = typeBuilder.CreateType();    var inst = (Bazzze)Activator.CreateInstance(type, new object[0]);     inst.Sum(10, 3.14); } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u044d\u0439\u043a\u043f\u043e\u0438\u043d\u0442 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 inst.Sum(10, 3.14); \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c F11 (step into), \u0432\u044b\u043f\u0430\u0434\u0435\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/5bc\/b73\/3e1\/5bcb733e1ab445dc9f5c1c20ac969bc1.jpg\"\/><\/p>\n<p>  \u0412 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u043a\u0443\u0434\u0430 \u0431\u044b\u043b \u0441\u043b\u043e\u0436\u0435\u043d \u0434\u0435\u0431\u0430\u0433-\u0444\u0430\u0439\u043b\u0438\u043a, \u0438 \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/058\/909\/7c9\/0589097c9ab54f88a8a97ae5ae5c58fa.jpg\"\/><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b Visual Studio \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0431\u0430\u0433\u0430\u0442\u044c \u043f\u043e F10\/F11, \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0440\u044d\u0439\u043a\u043f\u043e\u0438\u043d\u0442\u044b, \u0432 watch \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, <font color=\"0000ff\">this<\/font>, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a \u0436\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0434\u0435\u0431\u0430\u0433\u0430\u0442\u044c <font color=\"00008b\">DynamicMethod<\/font>&#8216;\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (\u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0437\u043d\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u044f \u0431\u044b\u043b \u0431\u044b \u0440\u0430\u0434 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c). \u041d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a IL-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u0430\u043a \u0434\u043b\u044f <font color=\"00008b\">DynamicMethod<\/font>&#8216;\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f <font color=\"00008b\">MethodBuilder<\/font>&#8216;\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c <font color=\"00008b\">DynamicMethod<\/font> \u043d\u0430 <font color=\"00008b\">MethodBuilder<\/font> \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430, \u0430 \u0432 \u0440\u0435\u043b\u0438\u0437-\u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c.<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>  \u0421 \u0432\u044b\u0441\u043e\u0442\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u044f\u0442\u0438\u043b\u0435\u0442\u043d\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 IL-\u043a\u043e\u0434\u0430 \u043c\u043e\u0433\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430 <font color=\"00008b\">ILGenerator<\/font> \u0438 <font color=\"00008b\">GroboIL<\/font> \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 C# \u0432 VisualStudio \u0441 \u0440\u0435\u0448\u0430\u0440\u043f\u0435\u0440\u043e\u043c \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435 \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 Accepted\/Rejected \u0431\u0435\u0437 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, <font color=\"00008b\">GroboIL<\/font> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c IL-\u043a\u043e\u0434 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, C#-\u043a\u043e\u0434, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u0430 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.             <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/262711\/\"> http:\/\/habrahabr.ru\/post\/262711\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>             \u042f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-specific_language\" title=\"Domain Specific Language\">DSL<\/a>). \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043b\u0443\u0447\u0448\u0438\u0439 \u2013 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e <font color=\"00008b\">Reflection.Emit<\/font> \u0438 CIL (Common Intermediate Language) \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0438: \u0443\u043c\u043d\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0435 \u043d\u0430\u0434 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.reflection.emit.ilgenerator.aspx\" title=\"ILGenerator\">ILGenerator<\/a> \u2013 <font color=\"00008b\">GroboIL<\/font> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/homuroll\/gremit\" title=\"Graceful Emit\">Graceful Emit<\/a>.<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c, \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IL. \u041a\u0441\u0442\u0430\u0442\u0438, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 <a href=\"https:\/\/code.google.com\/p\/protobuf-net\/\" title=\"protobuf-net\">protobuf-net<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d IL-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c IL-\u043a\u043e\u0434\u0430, \u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c IL. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"http:\/\/www.codeproject.com\/Articles\/3778\/Introduction-to-IL-Assembly-Language\" title=\"Introduction to IL Assembly Language\">Introduction to IL Assembly Language<\/a>.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-261552","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=261552"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261552\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=261552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=261552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=261552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}