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文件(注意,如果要转 ...
随机推荐
- linux 常见名词及命令(三)
tar 用于对文件打包压缩或解压. 示例: 打包并压缩文件:tar -czvf 压缩包名.tar.gz 文件名 解压并展开压缩包:tar -zxvf 压缩包名.tar.gz -c 创建压缩文件 -x ...
- Eclipse-Java代码规范和质量检查插件-PMD
PMD是一个源代码分析器. 它发现常见的编程缺陷,如未使用的变量.空catch块.不必要的对象创建等等. 它支持Java.JavaScript.Salesforce.com Apex.PLSQL.Ap ...
- 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类
一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlse ...
- 总结 React 组件的三种写法 及最佳实践
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- has实现 更新视图但不重新加载页面原理
URL中#符号本身以及它的字符称之为hash,可以通过window.location.hash获取.hash具有如下特点: 1.has虽然出现在URL中,但不会被包括在http请求中.因此,改变has ...
- Servlet+JSP 原理
Servlet是用Java编写的Server端程序,与协议和平台无关,可移植行较强. Servlet在编辑时须要导入特定的Servlet API 的包,类似于普通Java程序的写法. Servlet採 ...
- 蜘蛛页面 获取一个网站的全部url 乐观代码
蜘蛛页面 from selenium import webdriver import time import random from bs4 import * import pymysql h, pt ...
- js中createlement和creatTextnode属性
js中可以使用creatElement方法创造一个新的元素,使用creatTextnode创造一个新的text文本元素. 之后使用appendchild插入到已存在的元素中. ** window.on ...
- Lein droid
最近尝试使用Clojure,发现有个Lein droid的项目可以方便的在android下使用Clojure. http://clojure-android.info/#get-started 尝试了 ...
- Code First: 五大映射模式
映射一 Mapping the Table-Per-Hierarchy (TPH) Inheritance 模型文件 using System.Data.Entity; using System.Da ...