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();
}
}
}