17,741
社区成员
发帖
与我相关
我的任务
分享
public static T Eval<T>(string code)
{
//get the code to compile
string strSourceCode = GetComplainCode(typeof(T).Name,code);
//1. Create an addtional AppDomain
AppDomainSetup objSetup = new AppDomainSetup();
objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain objAppDomain = AppDomain.CreateDomain("MyAppDomain", null, objSetup);
// 1.Create a new CSharpCodePrivoder instance
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
// 2.Sets the runtime compiling parameters by crating a new CompilerParameters instance
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("system.dll");
objCompilerParameters.ReferencedAssemblies.Add("gzLib.dll");
// Load the remote loader interface
//objCompilerParameters.ReferencedAssemblies.Add("RemoteAccess.dll");
// Load the resulting assembly into memory
objCompilerParameters.GenerateInMemory = false;
string outFileName = "TempCompilerResult" + new Random().Next() + ".dll";
objCompilerParameters.OutputAssembly = outFileName;
// 3.CompilerResults: Complile the code snippet by calling a method from the provider
CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, strSourceCode);
if (cr.Errors.HasErrors) {
StringBuilder error = new StringBuilder();
error.Append("Error Compiling Expression: ");
foreach (CompilerError err in cr.Errors)
{
error.AppendFormat("{0}\n", err.ErrorText);
}
throw new Exception("Error Compiling Expression: " + error.ToString());
}
// 4. Invoke the method by using Reflection
object evalObj=objAppDomain.CreateInstance(cr.CompiledAssembly.FullName, "GzAutoEval._GzEvalClass").Unwrap();
// with help of factory, create a real 'LiveClass' instance
MethodInfo mi = evalObj.GetType().GetMethod("Eval");
T value = (T)mi.Invoke(evalObj, null);
AppDomain.Unload(objAppDomain);
System.IO.File.Delete(outFileName);
return value;
}