Pergunta

Estou tentando incluir uma classe estática de métodos de extensão em um assembly gerado dinamicamente, exceto que continuo recebendo um erro do compilador de 'Tipo esperado' na linha 6, coluna 28, que está na palavra 'isto'.Se eu remover 'isto', nenhum erro será retornado (mas não é um método de extensão).

 public static void CodeDomDooDad()
    {
        using (var provider = new CSharpCodeProvider())
        {
            var compilerParameters = new CompilerParameters();

            compilerParameters.ReferencedAssemblies.Add("system.dll");
            compilerParameters.CompilerOptions = "/t:library";
            compilerParameters.GenerateInMemory = true;

            var sb = new StringBuilder();

            sb.Append("namespace MooCow \n{ \n");
            sb.Append("public static class Extensions {\n");
            sb.Append("public static string ToMoo(this string s) {\n");
            sb.Append("return s.Replace(\" \",\"moo\");\n");
            sb.Append("}\n");
            sb.Append("}\n");
            sb.Append("}\n");

            //Console.WriteLine(sb.ToString());

            var cr = provider.CompileAssemblyFromSource(compilerParameters, sb.ToString());
            if (cr.Errors.Count > 0)
            {
                CompilerError error = cr.Errors[0];
                Console.WriteLine(
                    "error:"+error.ErrorText + 
                    " line:" +error.Line + 
                    " col:" +error.Column + 
                    " isWarning:" + error.IsWarning);
            }
        }
    }

Este é o código gerado, que funciona bem.

namespace MooCow {
public static class Extensions
{
    public static string ToMoo(this string s)
    {
        return s.Replace(" ", "moo");
    }
}

}

Foi útil?

Solução

acho que descobri, tive que adicionar CompilerVersion ao construtor CSharpProvider ...var provedor = new CSharpCodeProvider( new Dictionary() { { "CompilerVersion", "v3.5" }})

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top