У меня есть следующий, довольно стандартный код в качестве обертки вокруг CSharpCodeProvider
. Этот класс работает очень хорошо и отлично работает и т.д. И т.д. Но, несмотря на то, что мое приложение построено на .NET 3.5 и ссылается на сборки v3.5 при выполнении этой компиляции, я до сих пор не получаю доступ к каким-либо дополнительного симпатичного синтаксиса С# 3.5, такого как lambda или auto-properties. Есть ли способ заставить это работать?
У меня создалось впечатление, что этот класс просто обернулся вокруг csc.exe
, идея, которая, похоже, будет подтверждена моим брандмауэром (мое приложение пытается получить доступ к csc.exe
). Возможно, мне просто нужно установить options.CompilerOptions
на что-то?
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:
У меня есть ссылки на mscorlib
, System.Core
, System.Text
и одна из моих собственных сборок на данный момент.