我按照参考做了一个例子看看,但是总在那句报错,我找了很多方法还是不行..郁闷ing...
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Windows.Forms;
using System.Text;namespace CompilerApp
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
GetValue("aaaa");
} static object GetValue( string value )
{
StringBuilder codeSnippet = new StringBuilder();
codeSnippet.Append("using System; \r\n");
codeSnippet.Append("using System.Windows.Forms; \r\n");
codeSnippet.Append("namespace CzG { \r\n");
codeSnippet.Append("public class Eval\r\n");
codeSnippet.Append("{ \r\n");
codeSnippet.Append(" public Eval(){} \r\n");
codeSnippet.Append(" public object GetValue() \r\n");
codeSnippet.Append(" { \r\n");
codeSnippet.Append(" return " + value + ";\r\n");
codeSnippet.Append(" }\r\n");
codeSnippet.Append(" public void ShowMesg()\r\n");
codeSnippet.Append(" {\r\n");
codeSnippet.Append(" System.Windows.Forms.MessageBox.Show(\"Application name cannot be empty\");\r\n");
codeSnippet.Append(" }\r\n");
codeSnippet.Append("}\r\n");
codeSnippet.Append("} \r\n");
codeSnippet.Append(" \r\n");
codeSnippet.Append(" \r\n");
CodeSnippetCompileUnit unit = new CodeSnippetCompileUnit( codeSnippet.ToString() );  ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters para = new CompilerParameters();
para.ReferencedAssemblies.Add( "System.dll" );
para.ReferencedAssemblies.Add( "System.Windows.Forms.dll" );
para.GenerateInMemory = true;
para.GenerateExecutable = false;
para.OutputAssembly = "CompilerApp.exe"; Assembly asm = compiler.CompileAssemblyFromDom( para , unit ).CompiledAssembly; Type type = asm.GetType( "CzG.Eval" );
MethodInfo mi = type.GetMethod( "Eval.ShowMesg" , BindingFlags.Public | BindingFlags.Instance ); //*****错在这里!!!!***** object obj = asm.CreateInstance( "CzG.Eval" ); return mi.Invoke( obj , null ); }

}
}大家直接拷贝粘贴就可以运行的,麻烦看看吧...谢谢

解决方案 »

  1.   

    "System.dll" 
    "System.Windows.Forms.dll"这两个dll要copy过来吧
      

  2.   

    几个地方有问题1。
    codeSnippet.Append(" return " + value + ";\r\n");
    ===>
    codeSnippet.Append(" return \"" + value + "\";\r\n");2。
    MethodInfo mi = type.GetMethod( "Eval.ShowMesg" , BindingFlags.Public | BindingFlags.Instance );
    ===>
    MethodInfo mi = type.GetMethod( "ShowMesg" , BindingFlags.Public | BindingFlags.Instance );
      

  3.   

    to:saucer(思归)老大
    我改过后还是那个原因.对了,csdn什么时候有钻石级别的啦...羡慕啊...
      

  4.   

    using System;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using System.Reflection;
    using System.Windows.Forms;
    using System.Text;namespace CompilerApp
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    GetValue("aaaa");
    } static object GetValue( string value )
    {
    StringBuilder codeSnippet = new StringBuilder();
    codeSnippet.Append("using System; \r\n");
    codeSnippet.Append("using System.Windows.Forms; \r\n");
    codeSnippet.Append("namespace CzG { \r\n");
    codeSnippet.Append("public class Eval\r\n");
    codeSnippet.Append("{ \r\n");
    codeSnippet.Append(" public Eval(){} \r\n");
    codeSnippet.Append(" public object GetValue() \r\n");
    codeSnippet.Append(" { \r\n");
    codeSnippet.Append(" return \"" + value + "\";\r\n");
    codeSnippet.Append(" }\r\n");
    codeSnippet.Append(" public void ShowMesg()\r\n");
    codeSnippet.Append(" {\r\n");
    codeSnippet.Append(" System.Windows.Forms.MessageBox.Show(GetValue().ToString());\r\n");
    codeSnippet.Append(" System.Windows.Forms.MessageBox.Show(\"Application name cannot be empty\");\r\n");
    codeSnippet.Append(" }\r\n");
    codeSnippet.Append("}\r\n");
    codeSnippet.Append("} \r\n");
    codeSnippet.Append(" \r\n");
    codeSnippet.Append(" \r\n");
    CodeSnippetCompileUnit unit = new CodeSnippetCompileUnit( codeSnippet.ToString() );  ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();
    CompilerParameters para = new CompilerParameters();
    para.ReferencedAssemblies.Add( "System.dll" );
    para.ReferencedAssemblies.Add( "System.Windows.Forms.dll" );
    para.GenerateInMemory = true;
    para.GenerateExecutable = false;
    para.OutputAssembly = @"CompilerApp.exe"; CompilerResults compres = compiler.CompileAssemblyFromDom( para , unit ); if (compres == null || compres.Errors.Count>0)
    {
    for (int i=0; i<compres.Errors.Count;i++)
    {
    Console.WriteLine(compres.Errors[i]);
    }
    }
    Assembly asm = compres.CompiledAssembly;
    //Console.WriteLine(asm != null);
    Type type = asm.GetType( "CzG.Eval" );
    //Console.WriteLine(type != null);
    MethodInfo mi = type.GetMethod( "ShowMesg" , BindingFlags.Public | BindingFlags.Instance );  object obj = asm.CreateInstance( "CzG.Eval" );
    //Console.WriteLine(obj != null);
    return mi.Invoke( obj , null ); }

    }
    }
      

  5.   

    sorry, changeif (compres == null || compres.Errors.Count>0)
    ===>
    if (compres != null && compres.Errors.Count>0)
      

  6.   

    有两个错1.
    codeSnippet.Append("return " + value + ";\r\n");
    如果你只传 value = "aaaa",那么这句就变成了return aaaa; // 这样就不存在 aaaa 变量要改成
    codeSnippet.Append("return \"" + value + "\";\r\n");
    2.
    MethodInfo mi = type.GetMethod( "Eval.ShowMesg" , BindingFlags.Public | BindingFlags.Instance ); //*****错在这里!!!!*****这里方法名 "Eval.ShowMesg" 改成  "ShowMesg"这样就OK了
      

  7.   

    to:saucer(思归)老大
    太感谢了,每每俺的问题都有老大和各位高手的解答...