关于CodeDom的测试

it2022-05-09  32

什么是CodeDom? 是代码文档对象模型 目的是程序不再建立在特定的语言的基础之上,而就是用各种程序的组成模块建立而成 对于一个程序的某块而言,使用oo的方法的话,其实就是命名空间,类,字段,属性,特性,方法等等组成的 我们可以使用CodeDom的机制,来描述程序的结构 根据描述所得到的东西,称之为CodeDom Graph,可以生成相应的特定语言组成的这个程序,可以存放在文件中,也可以存放在内存中 用相应的语言的编译器(来自这门语言的Provider)+编译参数来编译,可以得到编译结果,然后就可以使用 我为什么会涉及CodeDom? 因为CodeDom可以减少某些工作+提供扩展性,现在的设想是,程序中提供一种机制,可以用CodeDom的方式,根据输入自动生成程序当中的某些特定类的子类(比如这些子类只是覆盖了父类的某个方法,那么只需要输入这个函数),然后将这个子类编译成为dll文件,放在特定目录下,所有该目录下的子类都为程序中某件事情的实现提供了不同的方式,这些dll会在程序中被加载,然后使用,比如有个combobox来提供处理一件事情的不同方式,那么这里的处理方式就是可扩展的,并且无需重新发布程序 这样的方式,是不是过于复杂而不值得呢,但是不试试是没有进步的吧 =============================================================== 简单的测试的例子 仅仅测试一下Microsoft.CSharp中提供的来处理C#语言的内容 ---------------------------------------------------------------------------------------------------------------------------------------------- 编译到Model.dll namespace Model { /// <summary> /// Summary description for Class1. /// </summary> public class Account { public Account() { // // TODO: Add constructor logic here // } private string code; private string name; public string Code { get { return code; } set { code = value; } } public string Name { get { return name; } set { name = value; } } } } --------------------------------------------------------------------------------------------------------------------------------------------- 要被动态编译的文件 using System; using Model; namespace TestCodeDom { public class TestCodeDom { public static void Main() { Model.Account account = new Model.Account(); account.Name = "5555"; account.Code = "6666"; } public Account CreateAccount() { Model.Account account = new Model.Account(); account.Name = "5555"; account.Code = "6666"; return account; } } } --------------------------------------------------------------------------------------------------------------------------------------------- 主界面中的事件处理 private void button1_Click(object sender, System.EventArgs e) { System.CodeDom.Compiler.CompilerParameters param = new CompilerParameters(); param.ReferencedAssemblies.Add("C:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\TestCodeDom\Model\bin\Debug\Model.dll"); param.GenerateInMemory = false; param.OutputAssembly = "C:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\TestCodeDom\TestCodeDom\Account.dll"; Microsoft.CSharp.CSharpCodeProvider csp = new CSharpCodeProvider(); System.CodeDom.Compiler.ICodeCompiler cp = csp.CreateCompiler(); System.CodeDom.Compiler.CompilerResults cr = cp.CompileAssemblyFromFile(param,"C:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\TestCodeDom\TestCodeDom\tobeCompiled.cs" ); foreach(CompilerError err in cr.Errors) { MessageBox.Show(err.ErrorText); } MessageBox.Show(cr.PathToAssembly); Object o = cr.CompiledAssembly.CreateInstance("TestCodeDom.TestCodeDom"); Type t = o.GetType(); MessageBox.Show(t.ToString()); Model.Account account = (Model.Account)t.InvokeMember("CreateAccount",BindingFlags.Public|BindingFlags.Instance|BindingFlags.InvokeMethod,null, o, null); MessageBox.Show(account.ToString()); MessageBox.Show(account.Code+account.Name); }

转载于:https://www.cnblogs.com/tuyile006/archive/2007/08/23/867526.html

相关资源:数据结构—成绩单生成器

最新回复(0)