Execute Brain****/Csharp

From Rosetta Code
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.CSharp;

class Brainfuck
{
    static string Translate(string brainfuck)
    {
        var dictionary = new Dictionary<char, string>();
        dictionary.Add('>', "p++;");
        dictionary.Add('<', "p--;");
        dictionary.Add('+', "m[p]++;");
        dictionary.Add('-', "m[p]--;");
        dictionary.Add('.', "Console.Write(m[p]);");
        dictionary.Add(',', "m[p]=(char)Console.Read();");
        dictionary.Add('[', "while(m[p]!=0){");
        dictionary.Add(']', "}");
        return "using System;class Program{public static void Main(){var p = 0;var m = new char[30000];" +
            string.Join(string.Empty, brainfuck.Where(c => dictionary.ContainsKey(c)).Select(c => dictionary[c])) + "}}";
    }

    static void Run(string csharp)
    {
        var compiler = new CSharpCodeProvider();
        var compilerParameters = new CompilerParameters();
        compilerParameters.ReferencedAssemblies.Add("System.dll");
        var compilerResults = compiler.CompileAssemblyFromSource(compilerParameters, csharp);
        var assembly = compilerResults.CompiledAssembly;
        var instance = assembly.CreateInstance("Program");
        instance.GetType().InvokeMember("Main", BindingFlags.InvokeMethod, null, instance, null);
    }

    static void Main()
    {
        var standardInput = Console.OpenStandardInput();
        var reader = new StreamReader(standardInput);
        var brainfuck = reader.ReadToEnd();
        Run(Translate(brainfuck));
    }
}