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. Linux下汇编语言学习笔记22 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  2. CentOS虚拟机与本机同步时间

    接着之前的任务,还是为了在VMWare上搭建分布式hadoop集群.搭着搭着注意到虚拟机上的时间和本机是不同步的,而且可以说是乱七八糟,3台虚拟机时间都与本机差了8个小时以上.首先确认不是时区的问题, ...

  3. Ubuntu 16.04开机自动挂载硬盘分区(转)

    说明:如果挂载以前旧硬盘分区时不需要第2.3步! 1.查看Linux硬盘信息: sudo fdisk -l 2.格式化新硬盘(很危险,注意操作时确定硬盘分区的位置): sudo mkfs.ext4 / ...

  4. 总结 React 组件的三种写法 及最佳实践

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  5. day4-hdfs的核心工作原理\写数据流程 \读数据流程

    namenode元数据管理要点 1.什么是元数据? hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>) 2.元数据由谁负责管理? namen ...

  6. 通过android XML 创建图形,降低对美工的依赖

    在开发中总会须要自己定义各种View的样式,假设总是依赖美工作图弄出须要的UI样式图片(比方:一个button要选中和默认两张图片),不但时间上会浪费.往往也会有适配问题. 尽管能够通过.9图来解决一 ...

  7. js类继承扩展super

    相应的资料https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/super 例子: class Pol ...

  8. 微信JSSDK使用指南

        这篇文章主要来说说微信JSSDK的一些配置和微信分享的使用,包括从前端sdk文件引入到server端和微信server的交互. 另外Tangide已经把一些工作做好了.我会简要说一说怎么把它用 ...

  9. mysql导出整个数据库

    mysql导出整个数据库 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql mysqldump - ...

  10. Project Euler problem 68

    题意须要注意的一点就是, 序列是从外层最小的那个位置顺时针转一圈得来的.而且要求10在内圈 所以,这题暴力的话,假定最上面那个点一定是第一个点,算下和更新下即可. #include <iostr ...