我按照参考做了一个例子看看,但是总在那句报错,我找了很多方法还是不行..郁闷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 ); }
}
}大家直接拷贝粘贴就可以运行的,麻烦看看吧...谢谢
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 ); }
}
}大家直接拷贝粘贴就可以运行的,麻烦看看吧...谢谢
"System.Windows.Forms.dll"这两个dll要copy过来吧
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 );
我改过后还是那个原因.对了,csdn什么时候有钻石级别的啦...羡慕啊...
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 ); }
}
}
===>
if (compres != null && compres.Errors.Count>0)
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了
太感谢了,每每俺的问题都有老大和各位高手的解答...