这个就是在程序中调用编译器···
2009-12-29 10:32
495 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.CSharp;
using Microsoft.Internal;
using Evaluator;
using System.Globalization;
using System.CodeDom;
using System.CodeDom.Compiler;
namespace xmlPathTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnAddNodes_Click(object sender, EventArgs e)
{
// 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
// 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
// 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll");
objCompilerParameters.ReferencedAssemblies.Add("xmlPathTest.exe");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
// 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, CreateCode(txtFrmName.Text.Trim()));
if (cr.Errors.HasErrors)
{
richTextBox1.Text = "编译错误:\r\n";
foreach (CompilerError err in cr.Errors)
{
richTextBox1.Text += err.ErrorText + "\r\n";
}
}
else
{
// 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly;
object objHelloWorld = objAssembly.CreateInstance("xmlPathTest.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
objMI.Invoke(objHelloWorld, null);
}
}
private string CreateCode(string frmName)
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("using System.Collections.Generic;");
sb.Append(Environment.NewLine);
sb.Append("using System.ComponentModel;");
sb.Append(Environment.NewLine);
sb.Append("using System.Data;");
sb.Append(Environment.NewLine);
sb.Append("using System.Drawing;");
sb.Append(Environment.NewLine);
sb.Append("using System.Text;");
sb.Append(Environment.NewLine);
sb.Append("using System.Windows.Forms;");
sb.Append(Environment.NewLine);
sb.Append("namespace xmlPathTest");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public void OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.AppendFormat(" new xmlPathTest.{0}().Show();",frmName);
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}");
richTextBox1.Text = sb.ToString();
return sb.ToString();
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.CSharp;
using Microsoft.Internal;
using Evaluator;
using System.Globalization;
using System.CodeDom;
using System.CodeDom.Compiler;
namespace xmlPathTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnAddNodes_Click(object sender, EventArgs e)
{
// 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
// 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
// 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll");
objCompilerParameters.ReferencedAssemblies.Add("xmlPathTest.exe");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
// 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, CreateCode(txtFrmName.Text.Trim()));
if (cr.Errors.HasErrors)
{
richTextBox1.Text = "编译错误:\r\n";
foreach (CompilerError err in cr.Errors)
{
richTextBox1.Text += err.ErrorText + "\r\n";
}
}
else
{
// 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly;
object objHelloWorld = objAssembly.CreateInstance("xmlPathTest.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
objMI.Invoke(objHelloWorld, null);
}
}
private string CreateCode(string frmName)
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("using System.Collections.Generic;");
sb.Append(Environment.NewLine);
sb.Append("using System.ComponentModel;");
sb.Append(Environment.NewLine);
sb.Append("using System.Data;");
sb.Append(Environment.NewLine);
sb.Append("using System.Drawing;");
sb.Append(Environment.NewLine);
sb.Append("using System.Text;");
sb.Append(Environment.NewLine);
sb.Append("using System.Windows.Forms;");
sb.Append(Environment.NewLine);
sb.Append("namespace xmlPathTest");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public void OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.AppendFormat(" new xmlPathTest.{0}().Show();",frmName);
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}");
richTextBox1.Text = sb.ToString();
return sb.ToString();
}
}
}
相关文章推荐
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 考试题:在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明
- c++程序调用被C编译器编译后的函数为什么要加extern "C"
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- void f(a[1000])编译器中其实就是调用void f(int *a)
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?
- The Blocks Problem,我的编译器对这个程序出现了很奇怪的错误!
- windows命令行下随时随地调用csc编译器的方法(解决dos下编译.net程序找不到CSC的问题)
- 在C++ 程序中调用被C编译器编译后的函数,为什么要加extern “C”?
- 一个.Net程序加壳程序 注意:这个壳对于内行是没有任何作用的,就是一个玩具。
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 经典面试题目--在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 3.有一个整形数组,只有一个数字出现了一次,请编写程序判断这个数字(大概题目就是这样的,记不太清了)
- target.getAttribute获取调用这个程序的元素的属性或id等
- Cmake调用NSIS(一个可执行文件,其实就是一个编译器)编译NSIS脚本问题研究
- 因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序。 主要的原理就是替换模板里的特殊字符。
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?