//[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));
}