在學使用CodeDom來動態產生.cs檔案,使用協助裡的例子,代碼居然編譯不通過
自己修改,調試通過,整理後主要代碼如下:
命名空間:
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;
}
協助裡的例子在:
.NET Framework->使用 .NET Framework 編程->動態產生和編譯以多種語言表示的原始碼