c#.net 内存中 动态创建类型以及程序集
2013-06-10 21:29
609 查看
c#.net 内存中 动态创建类型以及程序集
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
namespace Com.Frzeng.Arch.Common.Data.AR
{
public class TypeCreator
{
public static Type Creator(string ClassName, int PropertiesCount)
{
IDictionary<string, Type> Properties = new Dictionary<string, Type>();
Type t = typeof(string);
Properties.Add(new KeyValuePair<string, Type>("ID", typeof(int)));
for (int i = 0; i < PropertiesCount; i++)
{
Properties.Add(new KeyValuePair<string, Type>("FF" + i, t));
}
return Creator(ClassName, Properties);
}
public static Type Creator(string ClassName, IDictionary<string, Type> Properties)
{
AppDomain currentDomain = System.Threading.Thread.GetDomain(); //AppDomain.CurrentDomain;
TypeBuilder typeBuilder = null;
ModuleBuilder moduleBuilder = null;
MethodBuilder methodBuilder = null;
PropertyBuilder propertyBuilder = null;
FieldBuilder fieldBuilder = null;
AssemblyBuilder assemblyBuilder = null;
ILGenerator ilGenerator = null;
CustomAttributeBuilder cab = null;
MethodAttributes methodAttrs;
//Define a Dynamic Assembly
assemblyBuilder = currentDomain.DefineDynamicAssembly(new AssemblyName("Test2"), AssemblyBuilderAccess.Run);//AssemblyBuilder.GetCallingAssembly().FullName
//Define a Dynamic Module
moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName", true);
//Define a runtime class with specified name and attributes.
typeBuilder = moduleBuilder.DefineType(ClassName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.BeforeFieldInit | TypeAttributes.Serializable);
cab = new CustomAttributeBuilder(typeof(Castle.ActiveRecord.ActiveRecordAttribute).GetConstructor(Type.EmptyTypes), new object[0]);
typeBuilder.SetCustomAttribute(cab);//
cab = new CustomAttributeBuilder(typeof(Castle.ActiveRecord.PropertyAttribute).GetConstructor(Type.EmptyTypes), new object[0]);
methodAttrs = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
foreach (KeyValuePair<string, Type> kv in Properties)
{
// Add the class variable, such as "m_strIPAddress"
fieldBuilder = typeBuilder.DefineField("field_" + kv.Key, kv.Value, FieldAttributes.Public);
propertyBuilder = typeBuilder.DefineProperty(kv.Key, System.Reflection.PropertyAttributes.HasDefault, kv.Value, null);
if (kv.Key != "ID")
propertyBuilder.SetCustomAttribute(cab);//
else
propertyBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(Castle.ActiveRecord.PrimaryKeyAttribute).GetConstructor(Type.EmptyTypes), new object[0]));//
methodBuilder = typeBuilder.DefineMethod("get_" + kv.Key, methodAttrs, kv.Value, Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(methodBuilder);
methodBuilder = typeBuilder.DefineMethod("set_" + kv.Key, methodAttrs, typeof(void), new Type[] { kv.Value });
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(methodBuilder);
}
//Create Class
return typeBuilder.CreateType();
return assemblyBuilder.GetType(ClassName);
return moduleBuilder.GetType(ClassName);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
namespace Com.Frzeng.Arch.Common.Data.AR
{
public class TypeCreator
{
public static Type Creator(string ClassName, int PropertiesCount)
{
IDictionary<string, Type> Properties = new Dictionary<string, Type>();
Type t = typeof(string);
Properties.Add(new KeyValuePair<string, Type>("ID", typeof(int)));
for (int i = 0; i < PropertiesCount; i++)
{
Properties.Add(new KeyValuePair<string, Type>("FF" + i, t));
}
return Creator(ClassName, Properties);
}
public static Type Creator(string ClassName, IDictionary<string, Type> Properties)
{
AppDomain currentDomain = System.Threading.Thread.GetDomain(); //AppDomain.CurrentDomain;
TypeBuilder typeBuilder = null;
ModuleBuilder moduleBuilder = null;
MethodBuilder methodBuilder = null;
PropertyBuilder propertyBuilder = null;
FieldBuilder fieldBuilder = null;
AssemblyBuilder assemblyBuilder = null;
ILGenerator ilGenerator = null;
CustomAttributeBuilder cab = null;
MethodAttributes methodAttrs;
//Define a Dynamic Assembly
assemblyBuilder = currentDomain.DefineDynamicAssembly(new AssemblyName("Test2"), AssemblyBuilderAccess.Run);//AssemblyBuilder.GetCallingAssembly().FullName
//Define a Dynamic Module
moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName", true);
//Define a runtime class with specified name and attributes.
typeBuilder = moduleBuilder.DefineType(ClassName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.BeforeFieldInit | TypeAttributes.Serializable);
cab = new CustomAttributeBuilder(typeof(Castle.ActiveRecord.ActiveRecordAttribute).GetConstructor(Type.EmptyTypes), new object[0]);
typeBuilder.SetCustomAttribute(cab);//
cab = new CustomAttributeBuilder(typeof(Castle.ActiveRecord.PropertyAttribute).GetConstructor(Type.EmptyTypes), new object[0]);
methodAttrs = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
foreach (KeyValuePair<string, Type> kv in Properties)
{
// Add the class variable, such as "m_strIPAddress"
fieldBuilder = typeBuilder.DefineField("field_" + kv.Key, kv.Value, FieldAttributes.Public);
propertyBuilder = typeBuilder.DefineProperty(kv.Key, System.Reflection.PropertyAttributes.HasDefault, kv.Value, null);
if (kv.Key != "ID")
propertyBuilder.SetCustomAttribute(cab);//
else
propertyBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(Castle.ActiveRecord.PrimaryKeyAttribute).GetConstructor(Type.EmptyTypes), new object[0]));//
methodBuilder = typeBuilder.DefineMethod("get_" + kv.Key, methodAttrs, kv.Value, Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(methodBuilder);
methodBuilder = typeBuilder.DefineMethod("set_" + kv.Key, methodAttrs, typeof(void), new Type[] { kv.Value });
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(methodBuilder);
}
//Create Class
return typeBuilder.CreateType();
return assemblyBuilder.GetType(ClassName);
return moduleBuilder.GetType(ClassName);
}
}
}
相关文章推荐
- .net 3.5 c#构建动态类型最佳实践
- C#动态创建和动态使用程序集、类、方法、字段等
- C# 在运行时动态创建类型
- ASP.NET MVC 2.0 in Vs2010 :使用C# 4.0中使用动态类型来传递ViewData
- asp.net C#动态添加创建生成button按钮控件没有触发执行响应click绑定事件处理
- C#动态创建和动态使用程序集、类、方法、字段等(一)
- paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法
- C#运用ADO.net动态创建excle并进行相应的数据修改显示
- .NET Compact Framework 1.0 下实现hbitmap,以及用hbitmap创建hdc(c#)
- C#动态创建和动态使用程序集、类、方法、字段等(二)
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- asp.net动态加载程序集创建指定类的实例及调用指定方法
- FCKeditor 上传修改,添加对文件的类型以及大小的限制(ASP.NET C#)
- C#动态创建和动态使用程序集、类、方法、字段等(二)
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- C# 中反射获取某类的子类和根据类型名动态创建对象
- FCKeditor 上传修改,添加对文件的类型以及大小的限制(ASP.NET C#)
- C#中Array类创建动态类型、长度的数组
- .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)
- C#学习笔记1:C#数据类型以及变量何时申请内存