annotate Examples/CS/Reflection.Emit/HelloWorldNormal.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Threading;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using NUnit.Framework;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 namespace Examples.Reflection.Emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 [TestFixture]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public class HelloWorldNormal
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public interface IHello
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 void SayHello(string toWhom);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public void Test()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 AssemblyName asmName = new AssemblyName();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 asmName.Name = "HelloWorld";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 AssemblyBuilder asmBuilder =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 Thread.GetDomain().DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("HelloWorld");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 TypeBuilder typeBuilder = modBuilder.DefineType(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 "Hello",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 TypeAttributes.Public,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 typeof(object),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 new Type[] { typeof(IHello) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 MethodBuilder methodBuilder = typeBuilder.DefineMethod("SayHello",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 MethodAttributes.Private | MethodAttributes.Virtual,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 typeof(void),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 new Type[] { typeof(string) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 typeBuilder.DefineMethodOverride(methodBuilder, typeof(IHello).GetMethod("SayHello"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 ILGenerator il = methodBuilder.GetILGenerator();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 // string.Format("Hello, {0} World!", toWhom)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 /*[a]*/il.Emit/*[/a]*/(OpCodes.Ldstr, "Hello, {0} World!");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 /*[a]*/il.Emit/*[/a]*/(OpCodes.Ldarg_1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 /*[a]*/il.Emit/*[/a]*/(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 // Console.WriteLine("Hello, World!");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /*[a]*/il.Emit/*[/a]*/(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 /*[a]*/il.Emit/*[/a]*/(OpCodes.Ret);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 Type type = typeBuilder.CreateType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 IHello hello = (IHello)Activator.CreateInstance(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 hello.SayHello("Emit");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }