Tengo el siguiente código bastante estándar como un contenedor alrededor de CSharpCodeProvider
. Esta clase funciona muy bien, funciona perfectamente, etc., etc. Pero, a pesar de que mi aplicación está desarrollada en .NET 3.5 y hace referencia a los ensamblados v3.5 al hacer esta compilación, todavía no tengo acceso a ninguna de la sintaxis extra agradable C# 3.5 como lambda's o auto-propiedades. ¿Hay alguna forma de hacer que esto funcione?CSharpCodeProvider parece estar estancado en .NET 2.0, ¿cómo obtengo nuevas características?
Tenía la impresión de que esta clase simplemente se ajustaba a csc.exe
, una idea que parecería confirmada por mi firewall (mi aplicación intenta acceder al csc.exe
). Tal vez solo necesito establecer options.CompilerOptions
en algo?
protected virtual void Compile()
{
Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider();
CompilerParameters options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = true;
options.IncludeDebugInformation = true;
foreach (string s in this.ReferencedAssemblies)
{
options.ReferencedAssemblies.Add(s);
}
CompilerResults result;
string source = this.CodeTemplate;
// [snip] Do some manipulation to fill in the template with values.
result = csProvider.CompileAssemblyFromSource(options, source);
this.HasErrors = result.Errors.HasErrors;
this.Errors = new CompilerError[result.Errors.Count];
result.Errors.CopyTo(Errors, 0);
if (HasErrors && ThrowOnErrors)
throw new InvalidProgramException("The code currently stored in the " + this.GetType() + " cannot be compiled.");
else if (HasErrors)
return;
this.CompiledAssembly = result.CompiledAssembly;
}
EDIT:
Tengo referencias a mscorlib
, System.Core
, System.Text
y uno de mis propios montajes en el momento.
3.5 está construido sobre el Marco 2.0. –