感兴趣的同仁可以试试。此贴仅为备忘。
命名空间:
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;
private void button1_Click(object sender, System.EventArgs e)
{
CodeCompileUnit CompileUnit = new CodeCompileUnit();
CodeNamespace Samples = new CodeNamespace("Samples");
Samples.Imports.Add( new CodeNamespaceImport("System") );
CompileUnit.Namespaces.Add( Samples );
CodeTypeDeclaration Class1 = new CodeTypeDeclaration("Class1");
Samples.Types.Add(Class1);
CodeEntryPointMethod Start = new CodeEntryPointMethod();
//输出HelloWord
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( new
CodeTypeReferenceExpression("System.Console"), "WriteLine", new
CodePrimitiveExpression("Hello World!") );
Start.Statements.Add(cs1);
Class1.Members.Add( Start );
//CSharpCodeProvider provider = new CSharpCodeProvider();
//ICodeGenerator gen = provider.CreateGenerator();
GenerateGraph(CompileUnit);
}
public void GenerateGraph(CodeCompileUnit compileunit)
{
// Obtains an ICodeGenerator from a CodeDomProvider class.
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeGenerator gen = provider.CreateGenerator();
// Creates a StreamWriter to an output file.
StreamWriter sw = new StreamWriter("d:\\TestGraph.cs", false);
// Generates source code using the code generator.
gen.GenerateCodeFromCompileUnit(compileunit, sw, new CodeGeneratorOptions());
// Closes the output files.
sw.Close();
}
private void button2_Click(object sender, System.EventArgs e)
{
CompileCode("d:\\TestGraph.cs");
}
//编辑生成Exe
public CompilerResults CompileCode(string filepath)
{
// Obtains an ICodeCompiler from a CodeDomProvider class.
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
// Configures a compiler parameters object which links System.dll and
// generates a file name based on the specified source file name.
CompilerParameters cp = new CompilerParameters(new string[] {"System.dll"}, filepath.Substring(0, filepath.LastIndexOf(".")+1)+"exe", false);
// Indicates that an executable rather than a .dll should be generated.
cp.GenerateExecutable = true;
// Invokes compilation.
CompilerResults cr = compiler.CompileAssemblyFromFile(cp, filepath);
// Returns the results of compilation.
return cr;
}