Я попытался скомпилировать код с файлом, но у него были некоторые ошибки. ошибки: 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
Это похоже на ограничение CodeDOM, не поддерживающего последние версии компилятора? Например, при использовании CSharpCodeProvider
вам необходимо вручную указать параметр "CompilerVersion"
, и он достигает только уровней до Roslyn.
Поскольку вы используете "protogen", обратите внимание, что "protogen" поддерживает версии компилятора нижнего уровня:
(он не является явным - для краткости - но такие вещи, как изменения #pragma
, также обрабатываются корректно при изменении языковой версии)
Я предполагаю, что С# 3 будет хорошим выбором для CodeDOM.
Это можно указать через веб-интерфейс пользователя, используя средства командной строки или может быть указан в файле.proto с использованием настраиваемых параметров.