抱歉没有太多时间给你一个恰当的答案,但这里是我旧项目中的 eval 代码:
CSharpCodeProvider c = new CSharpCodeProvider();
ICodeCompiler icc = c.CreateCompiler();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.xml.dll");
cp.ReferencedAssemblies.Add("system.data.dll");
cp.ReferencedAssemblies.Add("system.windows.forms.dll");
cp.ReferencedAssemblies.Add("system.drawing.dll");
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
StringBuilder sb = new StringBuilder("");
sb.Append("using System;\n");
sb.Append("using System.Xml;\n");
sb.Append("using System.Data;\n");
sb.Append("using System.Data.SqlClient;\n");
sb.Append("using System.Windows.Forms;\n");
sb.Append("using System.Drawing;\n");
sb.Append("namespace CSCodeEvaler{ \n");
sb.Append("public class CSCodeEvaler{ " + csCode + "} }");
CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());
if (cr.Errors.Count > 0)
{
MessageBox.Show("ERROR: " + cr.Errors[0].ErrorText,
"Error evaluating cs code", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("Transform");
return mi;
该代码的原始变体来源于:http://www.codeproject.com/KB/cs/evalcscode.aspx
它编译一些 C# 代码(代码应该在 csCode
变量中),然后尝试在其中找到 Transform() 方法并返回其 MethodInfo,以便我们可以执行它。
但请记住,每次调用此代码都会加载一个新程序集,因此不要过于频繁地使用它。
另外,正如 Prescott 所说- 尝试使用 Roslyn。
希望这可以帮到您。很抱歉没有提供更具体的与您问题相关的代码示例。
附注:如果您想要一些交互式窗口,则有第三方控件可用(使用谷歌搜索以查找,因为我不记得确切的产品名称)。