社区
C#
帖子详情
关于动态编译的问题?(UP有分)
悄悄的回来了
2005-01-04 11:15:52
各位老大:什么是动态编译?他的原理是怎么回事?怎样写一个简单的动态编译例子(C#)?
谢谢了!
...全文
224
14
打赏
收藏
关于动态编译的问题?(UP有分)
各位老大:什么是动态编译?他的原理是怎么回事?怎样写一个简单的动态编译例子(C#)? 谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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!
理解kernel Makeiflie
编译
12年嵌入式开发,一直在一线做产品研发, 深深明白,看懂
编译
流程,掌握代码是如何
编译
非常重要 做一个芯片方案,从拿到资料和代码开始,第一件事就是
编译
代码,解决
编译
问题
另外,看懂代码也必须看懂
编译
过程,...
编译
curl的
动态
库以及curl
动态
库的使用
文章目录1、
编译
curl静态库2、curl
动态
库的
编译
1、直接
编译
curl源码2、用户生成自定义curl
动态
库2.1、用户根据自己的需要,列出需要使用的接口2.2 实现上述的接口2.3 接口均实现完成,点击
编译
即可2.4 其他情况3、...
curl
编译
成供vs2015使用的
动态
库
在GitHub上我们可以下载curl的源码,源码可以
编译
成供我们特定
编译
工具使用的
动态
库,例如
编译
成vs2011、vs2013、vs2015以及vs2017。下面将以
编译
成vs2015进行讲解,
编译
成其他版本的和这个过程差不多。 1 下载curl...
C#调用mingw
编译
出来的
动态
链接库
一般情况C#调用MSVC
编译
出来的C/C++
动态
库,不会有太大
问题
,但是如果是mingw
编译
出来的呢? 答案是不确定的,得取决于你如何
编译
! 今天在这用一个例子实现C# 调用mingw
编译
出来的
动态
链接库
编译
库: qt的pro...
vs
编译
动态
库和使用
动态
库的几种方式
模块定义文件里填写 def文件名(否则dll不会有导出函数的信息)。 调用
动态
库的几种方式 直接用LoadLibrary函数加载。 #include #include <windows.h> #include using namespace std; typedef int (*...
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章