CodeDomProvider 可用来创建和检索代码生成器和代码编译器的实例。代码生成器可以生成特定语言的代码,如:C#、Visual Basic、JScript 等,而代码编译器可以将代码文件编译成程序集(*.dll)或可执行文件(*.exe)。有点类似用 JavaScript 函数创建 HTML 文档中的 DOM 树。

示例

在下面的示例程序 Program.cs 中,使用 CodeDOM 命名空间下的对象来生成和编译源程序,并利用 Console 类来输出 “Hello World” 字符串。程序中还提供了几种不同的编程语言:C#、Visual Basic 和 JScript。

using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO; namespace CodeDomApp
{
class Program
{
static void Main(string[] args)
{
//c#
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
//CodeDomProvider provider = CodeDomProvider.CreateProvider("VisualBasic");
//CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript"); //生成对应的代码文件
CodeDomExample.GenerateCode(provider, CodeDomExample.BuildHelloWorldGraph()); //编译生成的代码文件
CompilerResults cr = CodeDomExample.CompileCode(provider, "TestGraph.cs", "TestGraph.exe");
if (cr.Errors.Count <= )
{
System.Console.WriteLine("把 TestGraph.cs 编译成 " + cr.PathToAssembly + " 时没有出现错误。");
}
//CodeDomExample.CompileCode(provider, "TestGraph.vb", "TestGraph.exe");
//CodeDomExample.CompileCode(provider, "TestGraph.js", "TestGraph.exe");
}
} class CodeDomExample
{
/// <summary>
/// 利用 System.CodeDom 对象生成一个 Hello World 程序的结构图
/// </summary>
/// <returns></returns>
public static CodeCompileUnit BuildHelloWorldGraph()
{
// 新建一个 CodeCompileUnit 来包含程序图纸
CodeCompileUnit compileUnit = new CodeCompileUnit(); // 声明一个名称为 Samples 的新命名空间
CodeNamespace samples = new CodeNamespace("Samples");
// 把新命名空间添加到程序编译单元中
compileUnit.Namespaces.Add(samples); // 添加新的命名空间(System 命名空间)的引用
samples.Imports.Add(new CodeNamespaceImport("System")); // 定义一个新类,取名为 Class1
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
// 把 Class1 添加到 Samples 命名空间中
samples.Types.Add(class1); // 定义新的代码入口点(Main 方法)
CodeEntryPointMethod start = new CodeEntryPointMethod(); // 为 System.Console 类创建一个类型引用
CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console"); // 构建一个 Console.WriteLine 方法的声明
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
csSystemConsoleType,
"WriteLine",
new CodePrimitiveExpression("Hello World!")); // 把 WriteLine 方法添加到 Main 方法中
start.Statements.Add(cs1); // 构建另一个 Console.WriteLine 方法的声明
CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression(
csSystemConsoleType,
"WriteLine",
new CodePrimitiveExpression("Press the Enter key to continue.")); // 把 WriteLine 方法添加到 Main 方法中
start.Statements.Add(cs2); // 构建 Console.ReadLine 方法的声明
CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(
csSystemConsoleType,
"ReadLine"); // 把 ReadLine 方法添加到 Main 方法中
start.Statements.Add(csReadLine); // 把 Main 方法添加 Class1 类中
class1.Members.Add(start); return compileUnit;
} /// <summary>
/// 生成代码文件
/// </summary>
/// <param name="provider">CodeDomProvider对象</param>
/// <param name="compileunit">CodeCompileUnit对象</param>
public static void GenerateCode(CodeDomProvider provider, CodeCompileUnit compileunit)
{
// 把源文件编译成相应格式的程序文件
string sourceFile;
if (provider.FileExtension[] == '.')
{
sourceFile = "TestGraph" + provider.FileExtension;
}
else
{
sourceFile = "TestGraph." + provider.FileExtension;
} // 新建一个 IndentedTextWriter 对象,
// 其构造函数包含一个读取源文件的 StreamWriter 对象
IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceFile, false), "");
// 利用生成器生成源代码
provider.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
// 关闭文件输出流
tw.Close();
} /// <summary>
/// 把代码文件编译可执行文件(*.exe)
/// </summary>
/// <param name="provider">CodeDomProvider对象</param>
/// <param name="sourceFile">源文件名称</param>
/// <param name="exeFile">生成的可执行文件的名称</param>
/// <returns></returns>
public static CompilerResults CompileCode(CodeDomProvider provider, string sourceFile, string exeFile)
{
// 配置一个 CompilerParameters 对象,它依赖 System.dll
// 并生成指定的可执行的文件
string[] referenceAssemblies = { "System.dll" };
CompilerParameters cp = new CompilerParameters(referenceAssemblies, exeFile, false);
// 生成一个可执行文件,而不是一个 DLL 文件
cp.GenerateExecutable = true; // 调用编译器
CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile); // 返回编译结果
return cr;
}
}
}

生成的文件如下:

运行 TestGraph.exe 时,输出结果如下:

参考资源:

https://msdn.microsoft.com/zh-cn/library/f1dfsbhc(v=vs.110).aspx

https://msdn.microsoft.com/zh-cn/library/system.codedom.compiler.codedomprovider(v=vs.110).aspx

CodeDOMProvider 类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  3. 微软CodeDom模型学习笔记(全)

    CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...

  4. CodeDom

    细说CodeDom 在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说, ...

  5. 【.net 深呼吸】细说CodeDom(9):动态编译

    知道了如果构建代码文档,知道了如何生成代码,那么编译程序集就很简单了. CodeDomProvider 类提供了三个可以执行编译的方法: 1.CompileAssemblyFromSource——这个 ...

  6. wsdl.exe的用法与参数说明

    wsdl.exe的用法与参数说明 打开.net自己带的Visual Studio .NET 2003或 2005 命令提示 输入 wsdl /language:VB /n:mynamespace /o ...

  7. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

  8. 如何引用XML文件生成C#类

    目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...

  9. 根据WSDL生成代理类方式

    方式一: 1.使用VS2010提供的工具wsdl.exe由WSDL文件生成cs文件 使用wsdl.exe的/serverInterface选项(或缩写的 /si)指定输入的wsdl文件(注意,如果要转 ...

随机推荐

  1. hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...

  2. Eclipse使用Maven时,修改默认中央仓库后的配置报错找不到包的问题解决

    一般在公司内容配置Maven时会在settings.xml文件下配置私服nexus地址,那么修改完之后在Eclipse中如果不指定用户目录级别的settings.xml文件会出现找不到包的问题. se ...

  3. 条款十六: 在operator=中对所有数据成员赋值

    当涉及到继承时,派生类的赋值运算符也必须处理它的基类成员的赋值!否则,当派生类对象向另一个派生类对象赋值时,只有派生类部分赋值了.看看下面: class base { public: ): x(ini ...

  4. NA交换①

    常用的交换设备:     交换机(ASIC)和网桥(Brigde):     交换机的三种转发方式:     直通式(Cut-Through):一旦检测到MAC即转发,速度快但是无法保证准确性:    ...

  5. ppt五种经典字体组合

    在做ppt中常常为使用哪种字体而头疼,如今将ppt的经典字体附上.希望对大家有帮助 五种经典的字体组合 标题字体 正文字体 使用场合 方正综艺简体 微软雅黑 课题汇报.咨询报告.学术研讨等正式场合 方 ...

  6. Thinking in Java---多线程仿真:银行出纳员仿真+饭店仿真+汽车装配工厂仿真

    多线程一个非常有意思的作用就是用于仿真,这篇博客就会结合几个仿真实例来综合运用一下前面所学的多线程并发知识. 一.银行出纳员仿真 问题描写叙述:银行会有非常多来办业务的顾客,他们会排队等待服务:对于银 ...

  7. 算法基础:正整数指定规则排序问题(Golang实现)

    给定字符串内有非常多正整数,要求对这些正整数进行排序.然后返回排序后指定位置的正整数 排序要求:依照每一个正整数的后三位数字组成的整数进行从小到大排序 1)假设不足三位,则依照实际位数组成的整数进行比 ...

  8. ios跟踪工具introspy使用

    1.cydia安装introspy,前提要安装Applist (雷锋源)     2.设置中有introspy-Apps instrospy-Settings选项. 可以选择需要跟踪的app以及跟踪内 ...

  9. 爬虫定时任务 redis 减轻 mysql 读的压力 加层

    非工作时间,定时任务爬虫大量mysq短链接,影响了其他业务的,mysql 报 too many connections  错误 将爬虫url池放入到redis中,单独的脚本维护redis url池的更 ...

  10. 查看jvm常用命令

    jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强 ...