菜鸟提问!关于C#编译器(基于.NET下的FCL的即时编译器)的问题

Nicholasqpl 2005-12-27 11:05:31
我按照参考做了一个例子看看,但是总在那句报错,我找了很多方法还是不行..郁闷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 );

}

}
}大家直接拷贝粘贴就可以运行的,麻烦看看吧...谢谢
...全文
147 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiaoci 2005-12-28
  • 打赏
  • 举报
回复
有两个错

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了

Nicholasqpl 2005-12-28
  • 打赏
  • 举报
回复
to:saucer(思归)老大
太感谢了,每每俺的问题都有老大和各位高手的解答...
fasfdserwrrre 2005-12-27
  • 打赏
  • 举报
回复
错误提示是什么?
saucer 2005-12-27
  • 打赏
  • 举报
回复
sorry, change

if (compres == null || compres.Errors.Count>0)
===>
if (compres != null && compres.Errors.Count>0)
saucer 2005-12-27
  • 打赏
  • 举报
回复
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 );

}

}
}
Nicholasqpl 2005-12-27
  • 打赏
  • 举报
回复
to:saucer(思归)老大
我改过后还是那个原因.

对了,csdn什么时候有钻石级别的啦...羡慕啊...
saucer 2005-12-27
  • 打赏
  • 举报
回复
几个地方有问题

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 );
xamaizi 2005-12-27
  • 打赏
  • 举报
回复
"System.dll"
"System.Windows.Forms.dll"

这两个dll要copy过来吧
Nicholasqpl 2005-12-27
  • 打赏
  • 举报
回复
是未将对象引用到对象实例

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧