关于动态编译的问题?(UP有分)

悄悄的回来了 2005-01-04 11:15:52
各位老大:什么是动态编译?他的原理是怎么回事?怎样写一个简单的动态编译例子(C#)?
谢谢了!
...全文
224 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
www8s88com 2005-03-04
  • 打赏
  • 举报
回复
study
saucer 2005-01-05
  • 打赏
  • 举报
回复
check the example in

http://www.oreilly.com/catalog/progcsharp/chapter/ch18.html

or

Dynamic Code Generation and Code Compilation
http://www.codeproject.com/dotnet/dynacodgen.asp
悄悄的回来了 2005-01-05
  • 打赏
  • 举报
回复
元编程----什么玩意!
睡觉了!明天再想。
dazhu2 2005-01-05
  • 打赏
  • 举报
回复
up
悄悄的回来了 2005-01-05
  • 打赏
  • 举报
回复
要沉了!
superzxf 2005-01-05
  • 打赏
  • 举报
回复
能否像vba一样把一段文本代码装载后编译执行,而且可以和主程序通讯
沈逸 2005-01-05
  • 打赏
  • 举报
回复
CodeCompileUnit cunit=new CodeCompileUnit();

CodeNamespace ns=new CodeNamespace("zj");

cunit.Namespaces.Add(ns);

ns.Imports.Add(new CodeNamespaceImport("System"));

//声明一个类
CodeTypeDeclaration typedec=new CodeTypeDeclaration("hello");
ns.Types.Add(typedec);

CodeConstructor cc=new CodeConstructor();//构造函数

cc.Attributes=MemberAttributes.Public;

CodeEntryPointMethod entrymed=new CodeEntryPointMethod();//入口点方法

CodeMethodInvokeExpression express=new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"),"WriteLine",new CodePrimitiveExpression("HelloWorld"));

entrymed.Statements.Add(express);

CodeMemberMethod getStr=new CodeMemberMethod();
getStr.Name="getWx";
getStr.Statements.Add(express);

typedec.Members.Add(cc);
typedec.Members.Add(getStr);
typedec.Members.Add(entrymed);

CodeDomProvider provider=new CSharpCodeProvider();
ICodeGenerator cg=provider.CreateGenerator();
IndentedTextWriter itw=new IndentedTextWriter(new StreamWriter("c:\\111.cs",false));
try
{

cg.GenerateCodeFromCompileUnit(cunit,itw,new CodeGeneratorOptions());

}
finally
{
itw.Close();
}
ambitionrual 2005-01-05
  • 打赏
  • 举报
回复
UP
turnmissile 2005-01-05
  • 打赏
  • 举报
回复
这是我的一个动态代码生成的例子,你可以参考一下:

[STAThread]
static void Main(string[] args)
{
// //equivalent of this code is:
// public class Utilities
// {
// private string a;
// public override string ToString(){return a;}
// public Utilities(string name) {a = name;}
// }


// create assembly
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "Utilities";
assemblyName.Version = new Version("1.0.1.0");

AssemblyBuilder assembly = Thread.GetDomain().DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.RunAndSave);

// create module
ModuleBuilder module;
module = assembly.DefineDynamicModule("MainModule", "Utilities.dll");

// create class Turnmissile.DynamicCode.Utilities
TypeBuilder utilsTypeBldr =module.DefineType("Turnmissile.DynamicCode.Utilities",
TypeAttributes.Class | TypeAttributes.Public, typeof(System.Object));

// equal to: private string a;
FieldBuilder nameFld = utilsTypeBldr.DefineField("a", typeof(string),
FieldAttributes.PrivateScope);

// equal to define of: public override string ToString();
MethodBuilder toStringMethod = utilsTypeBldr.DefineMethod("ToString",
MethodAttributes.Public | MethodAttributes.Virtual, typeof(string), Type.EmptyTypes);

// equal to: return a;
ILGenerator toStringIL = toStringMethod.GetILGenerator();
toStringIL.Emit(OpCodes.Ldarg_0);
toStringIL.Emit(OpCodes.Ldfld, nameFld);
toStringIL.Emit(OpCodes.Ret);

// equal to define of: public Utilities(string name)
Type[] constructorParamList = {typeof(string)};
ConstructorInfo objectConstructor = (typeof(System.Object)).GetConstructor(new Type[0]);

// equal to: a = name;
ConstructorBuilder constructor = utilsTypeBldr.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard,
constructorParamList);
ILGenerator constructorIL = constructor.GetILGenerator();
constructorIL.Emit(OpCodes.Ldarg_0);
constructorIL.Emit(OpCodes.Call, objectConstructor);
constructorIL.Emit(OpCodes.Ldarg_0);
constructorIL.Emit(OpCodes.Ldarg_1);
constructorIL.Emit(OpCodes.Stfld, nameFld);
constructorIL.Emit(OpCodes.Ret);

// create type
Type utilsType = utilsTypeBldr.CreateType();

// use this assembly
object utils = Activator.CreateInstance(utilsType,
new object[]{"New Object!"});
object name = utilsType.InvokeMember("ToString",BindingFlags.InvokeMethod, null, utils, null);
Console.WriteLine("ToString() returned: "+ (string)name);

// save
assembly.Save("Utilities.dll");

Console.ReadLine();

}
sskset 2005-01-05
  • 打赏
  • 举报
回复
up
ClampHammer 2005-01-05
  • 打赏
  • 举报
回复
就是.net的反射机制吧。
利用反射可以实现元数据的查询和动态代码生成。
magiccoder 2005-01-04
  • 打赏
  • 举报
回复
我理解的动态编译:
.Net 反射机制.
楼主可以查查这方面的资料!
悄悄的回来了 2005-01-04
  • 打赏
  • 举报
回复
别掉了!
xjjdanran 2005-01-04
  • 打赏
  • 举报
回复
一楼,UP!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧