Pregunta

Estoy usando CodeDom para permitir que se ejecuten scripts personalizados (C #) en una aplicación que estoy creando. Mientras escribo el script, me gustaría poder verificar si hay errores de compilación.El código se agrega y se compila en la memoria mucho más tarde y se ejecuta, por lo que no quiero que el ensamblado se compile mientras se escribe el script para que permanezca en la memoria.

¿Cuál es la mejor manera de lograrlo?

¿Es posible eliminar el ensamblado de la memoria después de compilar?

private void Item_Click(object sender, EventArgs e)
{
    List<string> assemblyNames = new List<string> { };
    List<string> code = new List<string> { };
    foreach (string str in GetCompileParameters())
            if (!assemblyNames.Contains(str))
                assemblyNames.Add(str);
    code.AddRange(GetScriptCode());

    CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
    CompilerParameters mCompileParams = new CompilerParameters(assemblyNames.ToArray());
    mCompileParams.GenerateInMemory = true;
    mCompileParams.CompilerOptions = "/target:library /optimize";

    CompilerResults results = provider.CompileAssemblyFromSource(mCompileParams, code.ToArray());
    if (results.Errors.HasErrors)
    {
        string error = "The following compile error occured:\r\n";
        foreach (CompilerError err in results.Errors)
            error += "File: " + err.FileName + "; Line (" + err.Line + ") - " + err.ErrorText + "\n";
        MessageBox.Show(error);
        return;
    }
    MessageBox.Show("No errors found");

    //Need to Remove assembly here
}

<”Actualización:

Gracias Keith.

Para cualquiera que esté interesado, este es el nuevo código que estoy usando con Roslyn

using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;

...

private void Item_Click(object sender, EventArgs e)
    {
        List<string> assemblyNames = new List<string> { }; 
        foreach (string str in GetCompileParameters())
                if (!assemblyNames.Contains(str))
                    assemblyNames.Add(str);

        SyntaxTree tree = SyntaxTree.ParseCompilationUnit(mScenario.GetScriptCode("ScriptName"));
        Compilation com = Compilation.Create("Script");
        com = com.AddReferences(new AssemblyFileReference(typeof(Object).Assembly.Location)); // Add reference mscorlib.dll
        com = com.AddReferences(new AssemblyFileReference(typeof(System.Linq.Enumerable).Assembly.Location)); // Add reference System.Core.dll
        com = com.AddReferences(new AssemblyFileReference(typeof(System.Net.Cookie).Assembly.Location)); // Add reference System.dll
        foreach (string str in assemblyNames)
            com = com.AddReferences(new AssemblyFileReference(str)); // Add additional references
        com = com.AddSyntaxTrees(tree);

        Diagnostic[] dg = com.GetDiagnostics().ToArray();
        if (dg.Length > 0)
        {
            string error = "The following compile error occured:\r\n";
            foreach (Diagnostic d in dg)
                error += "Info: " + d.Info + "\n";
            MessageBox.Show(error, "Compile Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
        } else {
            MessageBox.Show("No errors found.", "Code Compiler", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
¿Fue útil?

Solución

Otros consejos

Para ver un ejemplo de cómo hacer esto con el CTP Roslyn , eche un vistazo a http://www.dotnetexpertguide.com/2011/10/c-Sharp-syntax-checker-aspnet-roslyn.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top