关于CodeDom的测试

什么是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);
}
posted @ 2007-08-23 23:17  小y  阅读(946)  评论(0编辑  收藏  举报