Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

84 lines
2.9 KiB
C#

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
[AttributeUsage (AttributeTargets.All)]
public class MyAttribute : Attribute {
public MyAttribute (object o) {
this.o = o;
}
public object my
{
get {
return o;
}
}
object o;
}
public class MyConstructorBuilder
{
public static int Main()
{
Type myHelloworld = MyCreateCallee(Thread.GetDomain());
ConstructorInfo myConstructor = myHelloworld.GetConstructor(new Type[]{typeof(String)});
object[] myAttributes1 = myConstructor.GetCustomAttributes(true);
if (myAttributes1 == null)
return 1;
if (myAttributes1.Length != 1)
return 2;
MyAttribute myAttribute = myAttributes1[0] as MyAttribute;
if (myAttribute == null)
return 3;
if (myAttribute.my.GetType() != typeof(TypeCode))
return 4;
return 0;
}
private static Type MyCreateCallee(AppDomain domain)
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "EmittedAssembly";
// Define a dynamic assembly in the current application domain.
AssemblyBuilder myAssembly =
domain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Run);
// Define a dynamic module in this assembly.
ModuleBuilder myModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule");
// Construct a 'TypeBuilder' given the name and attributes.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("HelloWorld",
TypeAttributes.Public);
// Define a constructor of the dynamic class.
ConstructorBuilder myConstructor = myTypeBuilder.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard, new Type[]{typeof(String)});
ILGenerator myILGenerator = myConstructor.GetILGenerator();
myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked");
myILGenerator.Emit(OpCodes.Ldarg_1);
MethodInfo myMethodInfo =
typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)});
myILGenerator.Emit(OpCodes.Call, myMethodInfo);
myILGenerator.Emit(OpCodes.Ret);
Type myType = typeof(MyAttribute);
ConstructorInfo myConstructorInfo = myType.GetConstructor(new Type[]{typeof(object)});
try
{
CustomAttributeBuilder methodCABuilder = new CustomAttributeBuilder (myConstructorInfo, new object [] { TypeCode.Double } );
myConstructor.SetCustomAttribute(methodCABuilder);
}
catch(ArgumentNullException ex)
{
Console.WriteLine("The following exception has occured : "+ex.Message);
}
catch(Exception ex)
{
Console.WriteLine("The following exception has occured : "+ex.Message);
}
return myTypeBuilder.CreateType();
}
}