ASP.NET----動的送信プログラムセット

24538 ワード


  
    
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection.Emit;
using System.Threading;
using System.Reflection;

namespace NET.MST.Sixth.EmitAssembly
{
class MainClass
{
/// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main( string [] args)
{
//
Object[] ctorParams = new Object[ 2 ];
ctorParams[
0 ] = 1000 ;
ctorParams[
1 ] = 2000 ;
// , AddClass
Type type = CreateAssembly();
// AddClass
object ptInstance = Activator.CreateInstance(type, ctorParams);
// ToString
Console.WriteLine(ptInstance.ToString());
// GetResult
MethodInfo info = type.GetMethod( " GetResult " , new Type[ 0 ]);
long result = ( long )info.Invoke(ptInstance, null );
Console.WriteLine(result.ToString());
Console.Read();
}

/// <summary>
///
///
/// C# :
// public class AddClass
// {
// private long first;
// private long second;

// public AddClass(long f, long s)
// {
// first = f;
// second = s;
// }
// public long GetResult()
// {
// return first + second;
// }

// public override string ToString()
// {
// return " :" +
// first.ToString() +
// "\r
:" +
// second.ToString();
// }
// }
/// </summary>
static Type CreateAssembly()
{
//
AppDomain myDomain = Thread.GetDomain();
AssemblyName myAsmName
= new AssemblyName();
myAsmName.Name
= " NewAssembly " ;
AssemblyBuilder assemblybuilder
= myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave);
//
ModuleBuilder addclassModule = assemblybuilder.DefineDynamicModule( " AddClass " , " AddClass.dll " );
//
TypeBuilder addclass = addclassModule.DefineType( " AddClass " , TypeAttributes.Public);
//
// :first second
FieldBuilder first = addclass.DefineField( " first " , typeof ( long ), FieldAttributes.Private);
FieldBuilder second
= addclass.DefineField( " second " , typeof ( long ), FieldAttributes.Private);
// AddClass
//
Type[] ctorParams = new Type[] { typeof ( long ), typeof ( long ) };
// AddClass System.Object
Type objType = Type.GetType( " System.Object " );
//
ConstructorInfo objCtor = objType.GetConstructor( new Type[ 0 ]);
// AddClass
ConstructorBuilder addCtor = addclass.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, ctorParams);
//
ILGenerator ctorIL = addCtor.GetILGenerator();
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Call, objCtor);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_1);
ctorIL.Emit(OpCodes.Stfld, first);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_2);
ctorIL.Emit(OpCodes.Stfld, second);
ctorIL.Emit(OpCodes.Ret);
// long GetResult()
//
MethodBuilder resultMethod = addclass.DefineMethod( " GetResult " , MethodAttributes.Public, typeof ( long ), new Type[ 0 ]);
// GetResult
ILGenerator resultIL = resultMethod.GetILGenerator();
// ILGenerator.EmitWriteLine(string) ,
//
resultIL.EmitWriteLine( " " );
//
// IL ,
resultIL.Emit(OpCodes.Ldarg_0);
resultIL.Emit(OpCodes.Ldfld, first);
resultIL.Emit(OpCodes.Ldarg_0);
resultIL.Emit(OpCodes.Ldfld, second);
resultIL.Emit(OpCodes.Add);
resultIL.Emit(OpCodes.Ret);
// String ToString
MethodBuilder tostringMethod = addclass.DefineMethod( " ToString " , MethodAttributes.Virtual | MethodAttributes.Public, typeof (String), new Type[ 0 ]);
ILGenerator stringIL
= tostringMethod.GetILGenerator();
stringIL.Emit(OpCodes.Ldstr,
" " );
stringIL.Emit(OpCodes.Ldarg_0);
stringIL.Emit(OpCodes.Ldflda, first);
stringIL.Emit(OpCodes.Call,
typeof ( long ).GetMethod( " ToString " , new Type[ 0 ]));
stringIL.Emit(OpCodes.Ldstr,
" \r
" );
stringIL.Emit(OpCodes.Ldarg_0);
stringIL.Emit(OpCodes.Ldflda, second);
stringIL.Emit(OpCodes.Call,
typeof ( long ).GetMethod( " ToString " , new Type[ 0 ]));
Type[] types
= new Type[ 4 ];
for ( int i = 0 ; i < types.Length; i ++ )
types[i]
= typeof (String);
stringIL.Emit(OpCodes.Call,
typeof (String).GetMethod( " Concat " ,types));
stringIL.Emit(OpCodes.Ret);
// System.Object
addclass.DefineMethodOverride(tostringMethod, typeof (System.Object).GetMethod( " ToString " ));
return addclass.CreateType();
}
}
}