CSharpCodeProvider, похоже, застрял в .NET 2.0, как мне получить новые функции?
У меня есть следующий, довольно стандартный код в качестве обертки вокруг 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
и одна из моих собственных сборок на данный момент.
Ответы
Ответ 1
Там есть флаг компилятора, который вы можете передать в конструктор (в словаре):
Dictionary<string,string> options = new Dictionary<string,string>
{
{ "CompilerVersion", "v3.5" }
};
var compiler = new CSharpCodeProvider(options);
То, что сработало для меня, во всяком случае...
Ответ 2
В ссылочных сборках попробуйте добавить ссылку на System.Core. Это должно сделать это. Там много функциональности 3.5. Если это не так, откройте свойства сборки для вашего текущего проекта и проверьте, какие другие сборки вы можете загрузить.