Подтвердить что ты не робот

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 и одна из моих собственных сборок на данный момент.

4b9b3361

Ответ 1

Там есть флаг компилятора, который вы можете передать в конструктор (в словаре):

Dictionary<string,string> options = new Dictionary<string,string>
{ 
    { "CompilerVersion", "v3.5" }
};

var compiler = new CSharpCodeProvider(options);

То, что сработало для меня, во всяком случае...

Ответ 2

В ссылочных сборках попробуйте добавить ссылку на System.Core. Это должно сделать это. Там много функциональности 3.5. Если это не так, откройте свойства сборки для вашего текущего проекта и проверьте, какие другие сборки вы можете загрузить.