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. openjudge6252 带通配符的字符串匹配

    描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个 ...

  2. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

    参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - n ...

  3. POJ 3233_Matrix Power Series

    题意: 求n*n矩阵的幂和 分析: 逐个加起来时间复杂度太高,通过在矩阵中套个矩阵和,再利用矩阵快速幂,最后时间复杂度为O(n3logn) 代码: #include<cstdio> #in ...

  4. Windows堆思维导图--Windows pro sp3

    http://bbs.pediy.com/showthread.php?p=1445192#post1445192

  5. Zabbix 监控服务器

    Zabbix 操作系统 :CentOS7.5 两台服务器: server端:192.168.206.6 client 端: 192.168.206.3 zabbix : 4.0 mariiadb : ...

  6. mysql连接字符串,连接字段结果集

    archie2010 ${原来姹紫嫣红开遍,似这般都付与扣钉八哥} mysql连接字符串,连接字段结果集 select CONCAT('My', 'S', 'QL连接字符串') as MySql; 连 ...

  7. Android架构的简单探讨(一)

    在CSDN上看到这样一篇译文,虽然最终的解决方案要按照自己特定的项目去设计,但该文还是引起了很多自己的共鸣,原文猛戳这里. 这是他提出的基于Messaging的MVC框架: 其中包含的设计思想在于:哪 ...

  8. web 开发之js---js获取select标签选中的值

    var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // 选中索引 va ...

  9. 2016/1/20 笔记 1, 包 引入 static 已经补充到类里 2,继承

    继承  1,关键字 extends       2,子类自动继承父类非私有的属性和方法 也叫成员变量 成员方法       3,super代表的是父类 调用父类的方法 默认在构造函数中生成      ...

  10. 洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

    P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误 ...