private void GenerateMethod(TypeBuilder type, MethodMetadata methodMetadata)
		{
			if(type == null)
				throw new ArgumentNullException("type");

			if(methodMetadata == null)
				throw new ArgumentNullException("methodMetadata");

			var attrs = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig;
			var callingConvenction = CallingConventions.HasThis;
			var parameters = methodMetadata.Parameters.Select(x => x.Type).ToArray();

			var method = type.DefineMethod(methodMetadata.Name, attrs, callingConvenction, methodMetadata.ReturnType, parameters);

			var il = method.GetILGenerator();
			var g = new DynamicILGenerator(il);

			foreach(var parameter in methodMetadata.Parameters)
				method.DefineParameter(parameter.Position, ParameterAttributes.None, parameter.Name);

			foreach(var local in methodMetadata.Block.Locals)
				g.DeclareLocal(local);

			foreach(var line in methodMetadata.Block.Lines)
				this.GenerateLine(g, line);
		}
示例#2
0
		public MethodMetadata Method(string methodName)
		{
			var method = new MethodMetadata(methodName);
			this.methods[methodName] = method;
			return method;
		}