Сбой атрибута CompileAssemblyFromFile c # 7.2

2

Я попытался скомпилировать код с файлом, но у него были некоторые ошибки. ошибки: 1. global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) no ';' в конце

2. public string Name { get; set; } = ""; public string Name { get; set; } = ""; '=' недопустимо

атрибут кода - С# 7. 2+, моя версия для проекта - 7.3,.Net FrameWork 4.6.1, любые идеи?

  CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters parameters = new CompilerParameters();
        parameters.CompilerOptions = "/target:library /optimize /warn:0";
        parameters.GenerateInMemory = true;
        parameters.GenerateExecutable = false;
        parameters.IncludeDebugInformation = true;
        parameters.ReferencedAssemblies.Add("System.dll");
        parameters.ReferencedAssemblies.Add("protobuf-net.dll");


        string[] csharp_files = Tool.GetAllFileNamesByPath(Options.Global.temp_cs_dir, new string[]{ "cs" }).ToArray<string>();

        CompilerResults results = provider.CompileAssemblyFromFile(parameters, csharp_files);

Файл ths cs

// This file was generated by a tool; you should avoid making direct changes.
// Consider using 'partial classes' to extend these types
// Input: Role.proto

#pragma warning disable CS1591, CS0612, CS3021, IDE1006
namespace DataTable
{

    [global::ProtoBuf.ProtoContract()]
    public partial class Role : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1)]
        public int Id { get; set; }

        [global::ProtoBuf.ProtoMember(2)]
        [global::System.ComponentModel.DefaultValue("")]
        public string Name { get; set; } = "";

        [global::ProtoBuf.ProtoMember(3)]
        public bool IsBool { get; set; }

        [global::ProtoBuf.ProtoMember(4, IsPacked = true)]
        public int[] Lst { get; set; }

        [global::ProtoBuf.ProtoMember(5)]
        [global::ProtoBuf.ProtoMap]
        public global::System.Collections.Generic.Dictionary<int, string> Dic { get; set; } = new global::System.Collections.Generic.Dictionary<int, string>();

    }

}

#pragma warning restore CS1591, CS0612, CS3021, IDE1006
  • 0
    System.CodeDom использует устаревший компилятор C #, который входит в состав фреймворка. Чтобы использовать синтаксис, доступный в более поздних версиях, вы должны принести свою собственную копию Roslyn. Рассмотрим пакет nuget Microsoft.Net.Compilers.
  • 0
    @HansPassant, хотя в этом конкретном случае, вероятно, проще попросить инструмент code-gen использовать синтаксис C # 3, поскольку это поддерживаемый вывод
Теги:
protobuf-net

1 ответ

2

Это похоже на ограничение CodeDOM, не поддерживающего последние версии компилятора? Например, при использовании CSharpCodeProvider вам необходимо вручную указать параметр "CompilerVersion", и он достигает только уровней до Roslyn.

Поскольку вы используете "protogen", обратите внимание, что "protogen" поддерживает версии компилятора нижнего уровня:

Изображение 174551

(он не является явным - для краткости - но такие вещи, как изменения #pragma, также обрабатываются корректно при изменении языковой версии)

Я предполагаю, что С# 3 будет хорошим выбором для CodeDOM.

Это можно указать через веб-интерфейс пользователя, используя средства командной строки или может быть указан в файле.proto с использованием настраиваемых параметров.

  • 0
    en .. спасибо Марк, это хорошая идея.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню