TypeBuilder l_typeBuilder = AppDomain.CurrentDomain. DefineDynamicAssembly ( new System.Reflection.AssemblyName("Reflection.Emit array initilization example"), System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave ).// DefineDynamicModule("Example").// DefineType("ExampleClass");//
FieldBuilder l_fieldBuilder = l_typeBuilder.DefineInitializedData("initialization_data", new byte[]{ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }, System.Reflection.FieldAttributes.Static);
FieldBuilder l_fieldBuilder2 = l_typeBuilder.DefineField("m_array", typeof(int[]), System.Reflection.FieldAttributes.Static | System.Reflection.FieldAttributes.Public);
ConstructorBuilder l_cb = l_typeBuilder.DefineTypeInitializer();
ILGenerator l_propGetILGen = l_cb.GetILGenerator(); l_propGetILGen.Emit(OpCodes.Ldc_I4, 3);// l_propGetILGen.Emit(OpCodes.Newarr, typeof(int));// , 3 l_propGetILGen.Emit(OpCodes.Dup);// . InitializeArray void, , l_propGetILGen.Emit(OpCodes.Ldtoken, l_fieldBuilder);// . RVA l_propGetILGen.EmitCall(OpCodes.Call, new System.Action<Array, RuntimeFieldHandle>(System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray).Method, new Type[] { });// ( ) l_propGetILGen.Emit(OpCodes.Stsfld, l_fieldBuilder2); // () l_propGetILGen.Emit(OpCodes.Ret);
using System; using System.Collections.Generic; using System.Text; using System.Reflection.Emit; namespace ReflectionEmitArrayInitializerExample { class Program { static void Main(string[] args) { TypeBuilder l_typeBuilder = AppDomain.CurrentDomain. DefineDynamicAssembly ( new System.Reflection.AssemblyName("Reflection.Emit array initilization example"), System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave ). DefineDynamicModule("Example"). DefineType("ExampleClass"); FieldBuilder l_fieldBuilder = l_typeBuilder.DefineInitializedData("initialization_data", new byte[]{ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }, System.Reflection.FieldAttributes.Static); FieldBuilder l_fieldBuilder2 = l_typeBuilder.DefineField("m_array", typeof(int[]), System.Reflection.FieldAttributes.Static | System.Reflection.FieldAttributes.Public); ConstructorBuilder l_cb = l_typeBuilder.DefineTypeInitializer(); ILGenerator l_propGetILGen = l_cb.GetILGenerator(); l_propGetILGen.Emit(OpCodes.Ldc_I4, 3); l_propGetILGen.Emit(OpCodes.Newarr, typeof(int)); l_propGetILGen.Emit(OpCodes.Dup); l_propGetILGen.Emit(OpCodes.Ldtoken, l_fieldBuilder); l_propGetILGen.EmitCall(OpCodes.Call, new System.Action<Array, RuntimeFieldHandle>(System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray).Method, new Type[] { }); l_propGetILGen.Emit(OpCodes.Stsfld, l_fieldBuilder2); l_propGetILGen.Emit(OpCodes.Ret); System.Type l_t = null; System.Reflection.FieldInfo l_pi = (l_t = l_typeBuilder.CreateType()).GetField("m_array"); int[] l_array = (int[])l_pi.GetValue(null); } } }
Source: https://habr.com/ru/post/247201/
All Articles