zoukankan      html  css  js  c++  java
  • 关于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);
    }
  • 相关阅读:
    [译]ECMAScript 6中的方法定义
    perlrequick中文版
    JavaScript:实例讲解使用ES6中默认参数和剩余参数时的注意事项
    [译]JavaScript引擎中的自动函数内联
    [译]Javascript:Harmony(ECMAScript规范)制定流程
    [译]通过学习其他语言来学习JavaScript
    [译]WebKit中的CSS预加载扫描器
    JavaScript:正则表达式的/y标识
    [译]CSS没有类
    [译]ES6:数组推导式和生成器推导式
  • 原文地址:https://www.cnblogs.com/tuyile006/p/867526.html
Copyright © 2011-2022 走看看