//[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
private object InvokeMethod(Type evaluatorType, string methodName, object evaluator, object[] methodParams)
{
try
{
return evaluatorType.InvokeMember(methodName, System.Reflection.BindingFlags.InvokeMethod, null, evaluator, methodParams);
}
catch
{
return null;
}
}
public string EvalCode(string typeName, string methodName, string sourceCode)
{
string output = ":)";
var compiler = CodeDomProvider.CreateProvider("CSharp");
var parameters = new CompilerParameters
{
CompilerOptions = "/t:library",
GenerateInMemory = true,
IncludeDebugInformation = true,
};
foreach (var reference in AppDomain.CurrentDomain.GetAssemblies())
{
try
{
parameters.ReferencedAssemblies.Add(reference.Location);
}
catch (Exception ex)
{
Debug.WriteLine("Cannot add assembly " + reference.FullName + " as reference.");
}
}
parameters.ReferencedAssemblies.Add(Application.StartupPath + "\\Some.dll");
var results = compiler.CompileAssemblyFromSource(parameters, sourceCode);
if (!results.Errors.HasErrors)
{
var assembly = results.CompiledAssembly;
var evaluatorType = assembly.GetType(typeName);
var evaluator = Activator.CreateInstance(evaluatorType);
output = (string)InvokeMethod(evaluatorType, methodName, evaluator, new object[] { output });
return output;
}
output = "\r\nError...";
return results.Errors.Cast<CompilerError>().Aggregate(output, (current, ce) => current + string.Format("\r\nline {0}: {1}", ce.Line, ce.ErrorText));
}