using System; using System.Reflection; using System.Reflection.Emit; class Program { static void Main(string[] args) { // create a new method builder var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.Save); var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule", "MyAssembly.dll"); var typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public); var methodBuilder = typeBuilder.DefineMethod("MyMethod", MethodAttributes.Public | MethodAttributes.Static, typeof(void), new Type[] { }); // create an IL generator for the method var il = methodBuilder.GetILGenerator(); // add IL instructions to print "Hello, world!" to the console il.Emit(OpCodes.Ldstr, "Hello, world!"); il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, null)); il.Emit(OpCodes.Ret); // create the type, save the assembly to disk, and execute the method typeBuilder.CreateType(); assemblyBuilder.Save("MyAssembly.dll"); var assembly = Assembly.LoadFile("MyAssembly.dll"); var method = assembly.GetType("MyType").GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Static); method.Invoke(null, new object[] { }); } }
using System; using System.Reflection; using System.Reflection.Emit; class Program { static void Main(string[] args) { // create a new type builder var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.RunAndCollect); var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule"); var typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public); // create a new private field var backingField = typeBuilder.DefineField("myField", typeof(string), FieldAttributes.Private); // define a public property with custom getter/setter methods var propertyBuilder = typeBuilder.DefineProperty("MyProperty", PropertyAttributes.None, typeof(string), null); var getMethodBuilder = typeBuilder.DefineMethod("get_MyProperty", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName, typeof(string), null); var getIl = getMethodBuilder.GetILGenerator(); getIl.Emit(OpCodes.Ldarg_0); getIl.Emit(OpCodes.Ldfld, backingField); getIl.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getMethodBuilder); var setMethodBuilder = typeBuilder.DefineMethod("set_MyProperty", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName, typeof(void), new Type[] { typeof(string) }); var setIl = setMethodBuilder.GetILGenerator(); setIl.Emit(OpCodes.Ldarg_0); setIl.Emit(OpCodes.Ldarg_1); setIl.Emit(OpCodes.Stfld, backingField); setIl.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(setMethodBuilder); // create the type, create an instance, and set the property value var myType = typeBuilder.CreateType(); var instance = Activator.CreateInstance(myType); myType.GetProperty("MyProperty").SetValue(instance, "Hello, world!"); // get the property value and print it to the console Console.WriteLine(myType.GetProperty("MyProperty").GetValue(instance)); } }This code generates a new public type with a single public property that has custom getter/setter methods. It uses the ILGenerator class to define the IL for these methods and then creates an instance of the new type and sets the property value. Finally, it retrieves the property value and prints it to the console. These examples use the System.Reflection.Emit namespace in C#.