定义

命名空间:
System.CodeDom.Compiler
程序集:
System.CodeDom.dll
CodeDomProvider 实现提供基类。 此类为抽象类。

本文内容

  1. 定义
  2. 示例
  3. 注解
  4. 实施者说明
  5. 构造函数
  6. 属性
  7. 方法
  8. 事件
  9. 适用于
  10. 另请参阅
    1. public abstract class CodeDomProvider : System.ComponentModel.Component
    CodeDomProvider
    派生
    Microsoft.CSharp.CSharpCodeProvider
    Microsoft.JScript.JScriptCodeProvider
    Microsoft.VisualBasic.VBCodeProvider

    示例

    以下示例程序可以根据使用类打印“Hello World”Console的程序的 CodeDOM 模型生成和编译源代码。 提供了Windows 窗体用户界面。 用户可以从多个选项中选择目标编程语言:C#、Visual Basic和JScript。 ```csharp using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; using System.Windows.Forms; using Microsoft.CSharp; using Microsoft.VisualBasic; using Microsoft.JScript;

// This example demonstrates building a Hello World program graph // using System.CodeDom elements. It calls code generator and // code compiler methods to build the program using CSharp, VB, or // JScript. A Windows Forms interface is included. Note: Code // must be compiled and linked with the Microsoft.JScript assembly. namespace CodeDOMExample { class CodeDomExample { // Build a Hello World program graph using // System.CodeDom types. public static CodeCompileUnit BuildHelloWorldGraph() { // Create a new CodeCompileUnit to contain // the program graph. CodeCompileUnit compileUnit = new CodeCompileUnit();

  1. // Declare a new namespace called Samples.
  2. CodeNamespace samples = new CodeNamespace("Samples");
  3. // Add the new namespace to the compile unit.
  4. compileUnit.Namespaces.Add(samples);
  5. // Add the new namespace import for the System namespace.
  6. samples.Imports.Add(new CodeNamespaceImport("System"));
  7. // Declare a new type called Class1.
  8. CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
  9. // Add the new type to the namespace type collection.
  10. samples.Types.Add(class1);
  11. // Declare a new code entry point method.
  12. CodeEntryPointMethod start = new CodeEntryPointMethod();
  13. // Create a type reference for the System.Console class.
  14. CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console");
  15. // Build a Console.WriteLine statement.
  16. CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
  17. csSystemConsoleType, "WriteLine",
  18. new CodePrimitiveExpression("Hello World!"));
  19. // Add the WriteLine call to the statement collection.
  20. start.Statements.Add(cs1);
  21. // Build another Console.WriteLine statement.
  22. CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression(
  23. csSystemConsoleType, "WriteLine",
  24. new CodePrimitiveExpression("Press the Enter key to continue."));
  25. // Add the WriteLine call to the statement collection.
  26. start.Statements.Add(cs2);
  27. // Build a call to System.Console.ReadLine.
  28. CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(
  29. csSystemConsoleType, "ReadLine");
  30. // Add the ReadLine statement.
  31. start.Statements.Add(csReadLine);
  32. // Add the code entry point method to
  33. // the Members collection of the type.
  34. class1.Members.Add(start);
  35. return compileUnit;
  36. }
  37. public static void GenerateCode(CodeDomProvider provider,
  38. CodeCompileUnit compileunit)
  39. {
  40. // Build the source file name with the appropriate
  41. // language extension.
  42. String sourceFile;
  43. if (provider.FileExtension[0] == '.')
  44. {
  45. sourceFile = "TestGraph" + provider.FileExtension;
  46. }
  47. else
  48. {
  49. sourceFile = "TestGraph." + provider.FileExtension;
  50. }
  51. // Create an IndentedTextWriter, constructed with
  52. // a StreamWriter to the source file.
  53. IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceFile, false), " ");
  54. // Generate source code using the code generator.
  55. provider.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
  56. // Close the output file.
  57. tw.Close();
  58. }
  59. public static CompilerResults CompileCode(CodeDomProvider provider,
  60. String sourceFile,
  61. String exeFile)
  62. {
  63. // Configure a CompilerParameters that links System.dll
  64. // and produces the specified executable file.
  65. String[] referenceAssemblies = { "System.dll" };
  66. CompilerParameters cp = new CompilerParameters(referenceAssemblies,
  67. exeFile, false);
  68. // Generate an executable rather than a DLL file.
  69. cp.GenerateExecutable = true;
  70. // Invoke compilation.
  71. CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
  72. // Return the results of compilation.
  73. return cr;
  74. }
  75. }
  76. public class CodeDomExampleForm : System.Windows.Forms.Form
  77. {
  78. private System.Windows.Forms.Button run_button = new System.Windows.Forms.Button();
  79. private System.Windows.Forms.Button compile_button = new System.Windows.Forms.Button();
  80. private System.Windows.Forms.Button generate_button = new System.Windows.Forms.Button();
  81. private System.Windows.Forms.TextBox textBox1 = new System.Windows.Forms.TextBox();
  82. private System.Windows.Forms.ComboBox comboBox1 = new System.Windows.Forms.ComboBox();
  83. private System.Windows.Forms.Label label1 = new System.Windows.Forms.Label();
  84. private void generate_button_Click(object sender, System.EventArgs e)
  85. {
  86. CodeDomProvider provider = GetCurrentProvider();
  87. CodeDomExample.GenerateCode(provider, CodeDomExample.BuildHelloWorldGraph());
  88. // Build the source file name with the appropriate
  89. // language extension.
  90. String sourceFile;
  91. if (provider.FileExtension[0] == '.')
  92. {
  93. sourceFile = "TestGraph" + provider.FileExtension;
  94. }
  95. else
  96. {
  97. sourceFile = "TestGraph." + provider.FileExtension;
  98. }
  99. // Read in the generated source file and
  100. // display the source text.
  101. StreamReader sr = new StreamReader(sourceFile);
  102. textBox1.Text = sr.ReadToEnd();
  103. sr.Close();
  104. }
  105. private void compile_button_Click(object sender, System.EventArgs e)
  106. {
  107. CodeDomProvider provider = GetCurrentProvider();
  108. // Build the source file name with the appropriate
  109. // language extension.
  110. String sourceFile;
  111. if (provider.FileExtension[0] == '.')
  112. {
  113. sourceFile = "TestGraph" + provider.FileExtension;
  114. }
  115. else
  116. {
  117. sourceFile = "TestGraph." + provider.FileExtension;
  118. }
  119. // Compile the source file into an executable output file.
  120. CompilerResults cr = CodeDomExample.CompileCode(provider,
  121. sourceFile,
  122. "TestGraph.exe");
  123. if (cr.Errors.Count > 0)
  124. {
  125. // Display compilation errors.
  126. textBox1.Text = "Errors encountered while building " +
  127. sourceFile + " into " + cr.PathToAssembly + ": \r\n\n";
  128. foreach (CompilerError ce in cr.Errors)
  129. textBox1.AppendText(ce.ToString() + "\r\n");
  130. run_button.Enabled = false;
  131. }
  132. else
  133. {
  134. textBox1.Text = "Source " + sourceFile + " built into " +
  135. cr.PathToAssembly + " with no errors.";
  136. run_button.Enabled = true;
  137. }
  138. }
  139. private void run_button_Click(object sender,
  140. System.EventArgs e)
  141. {
  142. Process.Start("TestGraph.exe");
  143. }
  144. private CodeDomProvider GetCurrentProvider()
  145. {
  146. CodeDomProvider provider;
  147. switch ((string)this.comboBox1.SelectedItem)
  148. {
  149. case "CSharp":
  150. provider = CodeDomProvider.CreateProvider("CSharp");
  151. break;
  152. case "Visual Basic":
  153. provider = CodeDomProvider.CreateProvider("VisualBasic");
  154. break;
  155. case "JScript":
  156. provider = CodeDomProvider.CreateProvider("JScript");
  157. break;
  158. default:
  159. provider = CodeDomProvider.CreateProvider("CSharp");
  160. break;
  161. }
  162. return provider;
  163. }
  164. public CodeDomExampleForm()
  165. {
  166. this.SuspendLayout();
  167. // Set properties for label1
  168. this.label1.Location = new System.Drawing.Point(395, 20);
  169. this.label1.Size = new Size(180, 22);
  170. this.label1.Text = "Select a programming language:";
  171. // Set properties for comboBox1
  172. this.comboBox1.Location = new System.Drawing.Point(560, 16);
  173. this.comboBox1.Size = new Size(190, 23);
  174. this.comboBox1.Name = "comboBox1";
  175. this.comboBox1.Items.AddRange(new string[] { "CSharp", "Visual Basic", "JScript" });
  176. this.comboBox1.Anchor = System.Windows.Forms.AnchorStyles.Left
  177. | System.Windows.Forms.AnchorStyles.Right
  178. | System.Windows.Forms.AnchorStyles.Top;
  179. this.comboBox1.SelectedIndex = 0;
  180. // Set properties for generate_button.
  181. this.generate_button.Location = new System.Drawing.Point(8, 16);
  182. this.generate_button.Name = "generate_button";
  183. this.generate_button.Size = new System.Drawing.Size(120, 23);
  184. this.generate_button.Text = "Generate Code";
  185. this.generate_button.Click += new System.EventHandler(this.generate_button_Click);
  186. // Set properties for compile_button.
  187. this.compile_button.Location = new System.Drawing.Point(136, 16);
  188. this.compile_button.Name = "compile_button";
  189. this.compile_button.Size = new System.Drawing.Size(120, 23);
  190. this.compile_button.Text = "Compile";
  191. this.compile_button.Click += new System.EventHandler(this.compile_button_Click);
  192. // Set properties for run_button.
  193. this.run_button.Enabled = false;
  194. this.run_button.Location = new System.Drawing.Point(264, 16);
  195. this.run_button.Name = "run_button";
  196. this.run_button.Size = new System.Drawing.Size(120, 23);
  197. this.run_button.Text = "Run";
  198. this.run_button.Click += new System.EventHandler(this.run_button_Click);
  199. // Set properties for textBox1.
  200. this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles.Top
  201. | System.Windows.Forms.AnchorStyles.Bottom
  202. | System.Windows.Forms.AnchorStyles.Left
  203. | System.Windows.Forms.AnchorStyles.Right);
  204. this.textBox1.Location = new System.Drawing.Point(8, 48);
  205. this.textBox1.Multiline = true;
  206. this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
  207. this.textBox1.Name = "textBox1";
  208. this.textBox1.Size = new System.Drawing.Size(744, 280);
  209. this.textBox1.Text = "";
  210. // Set properties for the CodeDomExampleForm.
  211. this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  212. this.ClientSize = new System.Drawing.Size(768, 340);
  213. this.MinimumSize = new System.Drawing.Size(750, 340);
  214. this.Controls.AddRange(new System.Windows.Forms.Control[] {this.textBox1,
  215. this.run_button, this.compile_button, this.generate_button,
  216. this.comboBox1, this.label1 });
  217. this.Name = "CodeDomExampleForm";
  218. this.Text = "CodeDom Hello World Example";
  219. this.ResumeLayout(false);
  220. }
  221. protected override void Dispose(bool disposing)
  222. {
  223. base.Dispose(disposing);
  224. }
  225. [STAThread]
  226. static void Main()
  227. {
  228. Application.Run(new CodeDomExampleForm());
  229. }
  230. }

} ```

注解

A CodeDomProvider 可用于创建和检索代码生成器和代码编译器的实例。 代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集。
备注
在 .NET Framework 2.0 中,代码生成器和代码编译器中提供的方法直接从代码提供程序获取。 无需调用 CreateGeneratorCreateCompiler 访问方法,并且这些方法标记为已过时。 这适用于预先存在的代码提供程序实现和新的代码提供程序实现。
CodeDomProvider实现通常提供代码生成和/或代码编译接口,用于生成代码和管理单个编程语言的编译。 Windows SDK 附带的实现支持CodeDomProvider多种语言。 这些语言包括 C#、Visual Basic、C++ 和 JScript。 开发人员或编译器供应商可以实现 ICodeGeneratorICodeCompiler 接口,并提供一个 CodeDomProvider 扩展 CodeDOM 支持的其他编程语言。
计算机配置文件 (Machine.config 中的 system.codedom> 元素) 为开发人员和编译器供应商提供了一种机制,用于为其他实现添加配置设置。< CodeDomProvider
CodeDomProvider 类提供静态方法来发现和枚举 CodeDomProvider 计算机上的实现。 该方法 GetAllCompilerInfo 返回计算机上的所有 CodeDomProvider 实现的设置。 该方法 GetCompilerInfo 根据编程语言名称返回特定 CodeDomProvider 实现的设置。 该方法 CreateProvider 返回特定语言实现的 CodeDomProvider 实例。
有关配置文件中的语言提供程序设置的更多详细信息,请参阅编译器和语言提供程序设置架构
备注
此类在类级别发出链接需求和继承需求。 如果直接调用方或派生类没有完全信任权限,则会引发 A SecurityException 。 有关安全需求的详细信息,请参阅 链接需求继承需求)。

实施者说明

在.NET Framework版本 1.0 和 1.1 中,代码提供程序包括实现CodeDomProviderICodeGeneratorICodeParserICodeCompiler。 在 .NET Framework 2.0 中,和CreateGenerator()CreateParser()CreateCompiler()方法已过时,ICodeGeneratorICodeCompiler并且方法在类中CodeDomProvider直接可用。 应在代码提供程序实现中重写这些方法,而不是调用基方法。

构造函数

CodeDomProvider() 初始化 CodeDomProvider 类的新实例。

属性

CanRaiseEvents 获取一个指示组件是否可以引发事件的值。
(继承自 Component)
Container 获取包含 IContainerComponent
(继承自 Component)
DesignMode 获取一个值,用以指示 Component 当前是否处于设计模式。
(继承自 Component)
Events 获取附加到此 Component 的事件处理程序的列表。
(继承自 Component)
FileExtension 获取用于当前语言的源代码文件的默认文件扩展名。
LanguageOptions 获取语言功能标识符。
Site 获取或设置 ComponentISite
(继承自 Component)

方法

CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[]))) 基于包含在 System.CodeDom 对象的指定数组中的 CodeCompileUnit 树,使用指定的编译器设置编译程序集。
CompileAssemblyFromFile(CompilerParameters, String[]))) 从包含在指定文件中的源代码,使用指定的编译器设置编译程序集。
CompileAssemblyFromSource(CompilerParameters, String[]))) 从包含源代码的字符串的指定数组,使用指定的编译器设置编译程序集。
CreateCompiler() 已过时。
在派生类中重写时,创建一个新的代码编译器。
CreateEscapedIdentifier(String)) 创建指定值的转义标识符。
CreateGenerator() 已过时。
在派生类中重写时,创建一个新的代码生成器。
CreateGenerator(String)) 在派生类中重写时,使用指定文件名创建新的代码生成器以用于输出。
CreateGenerator(TextWriter)) 在派生类中重写时,使用指定的 TextWriter 创建新的代码生成器以用于输出。
CreateObjRef(Type)) 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。
(继承自 MarshalByRefObject)
CreateParser() 已过时。
在派生类中重写时,创建一个新的代码分析器。
CreateProvider(String)) 获取指定语言的 CodeDomProvider 实例。
CreateProvider(String, IDictionary)))) 获取指定的语言和提供程序选项的 CodeDomProvider 实例。
CreateValidIdentifier(String)) 为指定的值创建有效标识符。
Dispose() 释放由 Component 使用的所有资源。
(继承自 Component)
Dispose(Boolean)) 释放由 Component 占用的非托管资源,还可以另外再释放托管资源。
(继承自 Component)
Equals(Object)) 确定指定对象是否等于当前对象。
(继承自 Object)
GenerateCodeFromCompileUnit(CodeCompileUnit, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 编译单元生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GenerateCodeFromExpression(CodeExpression, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 表达式生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 成员声明生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 命名空间生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 语句生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GenerateCodeFromType(CodeTypeDeclaration, TextWriter, CodeGeneratorOptions)) 为指定的代码文档对象模型 (CodeDOM) 类型声明生成代码,并使用指定的选项将代码发送到指定的文本编写器。
GetAllCompilerInfo() 返回此计算机的语言提供程序和编译器配置设置。
GetCompilerInfo(String)) 返回指定语言的语言提供程序和编译器配置设置。
GetConverter(Type)) 获取指定数据类型的 TypeConverter
GetHashCode() 作为默认哈希函数。
(继承自 Object)
GetLanguageFromExtension(String)) 返回与指定文件扩展名关联的语言名称,如 CodeDomProvider 编译器配置节中所配置的那样。
GetLifetimeService() 检索控制此实例的生存期策略的当前生存期服务对象。
(继承自 MarshalByRefObject)
GetService(Type)) 返回一个对象,该对象表示由 Component 或它的 Container 提供的服务。
(继承自 Component)
GetType() 获取当前实例的 Type
(继承自 Object)
GetTypeOutput(CodeTypeReference)) 获取由指定的 CodeTypeReference 指示的类型。
InitializeLifetimeService() 获取生存期服务对象来控制此实例的生存期策略。
(继承自 MarshalByRefObject)
IsDefinedExtension(String)) 测试文件扩展名是否在计算机上配置了关联的 CodeDomProvider 实现。
IsDefinedLanguage(String)) 测试某语言是否已在计算机上配置了 CodeDomProvider 实现。
IsValidIdentifier(String)) 返回一个值,该值指示指定的值是否是当前语言的有效标识符。
MemberwiseClone() 创建当前 Object 的浅表副本。
(继承自 Object)
MemberwiseClone(Boolean)) 创建当前 MarshalByRefObject 对象的浅表副本。
(继承自 MarshalByRefObject)
Parse(TextReader)) 将从指定文本流读取的代码编译进 CodeCompileUnit
Supports(GeneratorSupport)) 返回一个值,该值指示是否提供了指定的代码生成支持。
ToString() 返回包含 Component 的名称的 String(如果有)。 不应重写此方法。
(继承自 Component)

事件

Disposed 在通过调用 Dispose() 方法释放组件时发生。
(继承自 Component)

适用于

产品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Platform Extensions 2.1, 2.2, 3.0, 3.1, 5, 6, 7 Preview 5
Windows Desktop 3.0, 3.1, 5, 6, 7 Preview 5
Xamarin.Mac 3.0

另请参阅