CodeDOMProvider 类
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 类的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 微软CodeDom模型学习笔记(全)
CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...
- CodeDom
细说CodeDom 在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说, ...
- 【.net 深呼吸】细说CodeDom(9):动态编译
知道了如果构建代码文档,知道了如何生成代码,那么编译程序集就很简单了. CodeDomProvider 类提供了三个可以执行编译的方法: 1.CompileAssemblyFromSource——这个 ...
- wsdl.exe的用法与参数说明
wsdl.exe的用法与参数说明 打开.net自己带的Visual Studio .NET 2003或 2005 命令提示 输入 wsdl /language:VB /n:mynamespace /o ...
- 解析利用wsdl.exe生成webservice代理类的详解
利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...
- 如何引用XML文件生成C#类
目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...
- 根据WSDL生成代理类方式
方式一: 1.使用VS2010提供的工具wsdl.exe由WSDL文件生成cs文件 使用wsdl.exe的/serverInterface选项(或缩写的 /si)指定输入的wsdl文件(注意,如果要转 ...
随机推荐
- Spring Cloud(7):Zuul自定义过滤器和接口限流
上文讲到了Zuul的基本使用: https://www.cnblogs.com/xuyiqing/p/10884860.html 自定义Zuul过滤器: package org.dreamtech.a ...
- Ionic3错误记录:navigation stack needs at least one root page
BUG场景:在 ActionSheetController 使用modalCtrl.create 创建模态框时报如下错误 原代码片段 解决方式: 重新设置root page
- DELPHI异步选择模型UDP
unit U_FrmServer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di ...
- 如何查看sqlalchemy执行的原始sql语句?
SQLAlchemy打开SQL语句方法如下,echo=true将开启该功能: engine = create_engine("<db_rul>", echo=True) ...
- Django学习系列之Form验证
django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...
- 实战c++中的vector系列--vector的一些异常
今天就写一写vector的一些异常.能够捕捉的异常. out_of_range 相当于数组的越界了.vector会自己主动增大容量,可是假设索引超出了当前的size.就会引发异常. #include& ...
- android学习一(了解android)
声明:android学习文件中面的全部内容为都是整理来自第一行代码Android.在接下来的文章里我就不在进行反复的声明. 想看原版的能够买书看看.或者去作者的博客http://blog.csdn.n ...
- CodeIgniter RestServer中put请求获取不到參数的问题解决
近期用restserver遇到个蛋疼的问题,发现$this->put得到的參数都是null.查了一下发现.这貌似这个普遍问题,參见链接:https://github.com/chriskacer ...
- java web中的session属性范围和request属性范围
首先必需要了解client跳转和server端跳转的差别: client跳转: response.sendRedict(String path).地址栏发生改变. 不能传递request属性. ser ...
- 使用逆向工程生成mybatis的Mapper文件
之前有写过一篇博客: 使用MyBatis Generator自动生成MyBatis的代码链接:http://www.cnblogs.com/klslb/p/6908535.html 这个太麻烦了,而且 ...