2 // MethodBuilderTestIL.cs - NUnit Test Cases for MethodBuilder.CreateMethodBody and MethodBuilder.SetMethodBody
4 // Marcos Henrich (marcos.henrich@xamarin.com)
10 using System.Reflection;
11 using System.Reflection.Emit;
12 using System.Threading;
14 using NUnit.Framework;
17 namespace MonoTests.System.Reflection.Emit
19 public abstract class MethodBuilderTestIL
21 protected abstract void SetIL (MethodBuilder methodBuilder, MemoryStream ilStream);
23 public static ModuleBuilder CreateModuleBuilder ()
25 AppDomain currentDom = Thread.GetDomain ();
27 AssemblyBuilder assemblyBuilder = currentDom.DefineDynamicAssembly (
28 new AssemblyName ("NewDynamicAssembly"),
29 AssemblyBuilderAccess.Run);
31 return assemblyBuilder.DefineDynamicModule ("NewModule");
34 public static object Invoke (Type type, MethodBuilder methodBuilder, params object[] parameters)
36 var method = type.GetMethods ().First (m => {
37 if (m.Name != methodBuilder.Name)
39 var params1 = m.GetParameters ();
40 var params2 = methodBuilder.GetParameters ();
41 if (params1.Length != params2.Length)
43 for (var i = 0; i < params1.Length; i++)
44 if (params1 [i].ParameterType.FullName != params2 [i].ParameterType.FullName)
50 object inst = Activator.CreateInstance (type, new object [0]);
52 return method.Invoke (inst, parameters);
56 public void CallMethodRef ()
58 var expected = "value";
60 var moduleBuilder = CreateModuleBuilder ();
61 var typeBuilder = moduleBuilder.DefineType ("NewType");
63 var methodBuilder1 = typeBuilder.DefineMethod ("NewMethod1",
64 MethodAttributes.Public | MethodAttributes.Static,
68 var gen1 = methodBuilder1.GetILGenerator ();
69 gen1.Emit (OpCodes.Ldstr, expected);
70 gen1.Emit (OpCodes.Ret);
72 var methodBuilder2 = typeBuilder.DefineMethod ("NewMethod2",
73 MethodAttributes.Public | MethodAttributes.Static,
77 var ilStream = new MemoryStream ();
78 var ilWriter = new BinaryWriter (ilStream);
79 ilWriter.Write ((byte) 0x28); // call
80 ilWriter.Write ((int) moduleBuilder.GetMethodToken (methodBuilder1).Token);
81 ilWriter.Write ((byte) 0x2A); // ret
83 SetIL (methodBuilder2, ilStream);
85 var type = typeBuilder.CreateType ();
87 Assert.AreEqual (expected, Invoke (type, methodBuilder2));
91 public void CallMethodDef ()
93 var expected = "value";
95 var moduleBuilder1 = CreateModuleBuilder ();
96 var typeBuilder1 = moduleBuilder1.DefineType ("NewType1", TypeAttributes.Public);
98 var methodBuilder1 = typeBuilder1.DefineMethod ("NewMethod1",
99 MethodAttributes.Public | MethodAttributes.Static,
103 var gen1 = methodBuilder1.GetILGenerator ();
104 gen1.Emit (OpCodes.Ldstr, expected);
105 gen1.Emit (OpCodes.Ret);
107 typeBuilder1.CreateType ();
109 var moduleBuilder2 = CreateModuleBuilder ();
110 var typeBuilder2 = moduleBuilder2.DefineType ("NewType2");
112 var methodBuilder2 = typeBuilder2.DefineMethod ("NewMethod2",
113 MethodAttributes.Public | MethodAttributes.Static,
117 var ilStream = new MemoryStream ();
118 var ilWriter = new BinaryWriter (ilStream);
119 ilWriter.Write ((byte) 0x28); // call
120 ilWriter.Write ((int) moduleBuilder2.GetMethodToken (methodBuilder1).Token);
121 ilWriter.Write ((byte) 0x2A); // ret
123 SetIL (methodBuilder2, ilStream);
125 var type = typeBuilder2.CreateType ();
127 Assert.AreEqual (expected, Invoke (type, methodBuilder2));
132 * Tests MethodBuilder.CreateMethodBody
135 public class MethodBuilderTestIL_CreateMethodBody : MethodBuilderTestIL
137 protected override void SetIL (MethodBuilder methodBuilder, MemoryStream ilStream)
139 methodBuilder.CreateMethodBody (ilStream.ToArray (), (int) ilStream.Length);
144 * Tests MethodBuilder.SetMethodBody
147 public class MethodBuilderTestIL_SetMethodBody : MethodBuilderTestIL
149 protected override void SetIL (MethodBuilder methodBuilder, MemoryStream ilStream)
151 methodBuilder.SetMethodBody (ilStream.ToArray (), 999, null, null, null);