public List <ClassDescripter> GenerateGrpcProxy(GrpcServerOptions options, CodeBuilder codeBuilder = null) { if (codeBuilder == null) { codeBuilder = CodeBuilder.Default; } var implInterfaceTypes = options.GetKServicers(); var classDescripterList = new List <ClassDescripter>(); var protoMessageCode = new StringBuilder(); var protoServiceCode = new StringBuilder(); foreach (Type service in implInterfaceTypes) { var bindServicesCode = new StringBuilder("return ServerServiceDefinition.CreateBuilder()\n"); protoServiceCode.AppendLine($"service {service.Name} {{"); var @class = this.GenerateGrpcService(service); var interfaces = service.GetInterfaces(); foreach (var method in service.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { if (method.CustomAttributes.FirstOrDefault(p => p.AttributeType == typeof(NotGrpcMethodAttribute)) != null) { continue; } var parameters = RpcParameterInfo.Convert(method.GetParameters()); if (parameters.Count == 0) { var emptyMessageType = typeof(EmptyMessage); parameters.Add(new RpcParameterInfo() { Name = emptyMessageType.Name, ParameterType = emptyMessageType, IsEmpty = true }); } @class = GenerateGrpcMethod(@class, method, parameters[0], interfaces); GenerateGrpcCallCode(method, parameters[0], options.NamespaceName, codeBuilder, ref bindServicesCode); GenerateGrpcCallCodeForOldVersion(method, parameters[0], options.NamespaceName, options.ServiceName, codeBuilder, ref bindServicesCode); if (options.IsGeneralProtoFile) { GenerateProtoCode(method, parameters[0], ref protoServiceCode, ref protoMessageCode); } } bindServicesCode.AppendLine(".Build();"); protoServiceCode.AppendLine(); protoServiceCode.AppendLine("}"); @class.CreateMember(new MethodDescripter("BindServices", false).SetCode(bindServicesCode.ToString()).SetReturn("ServerServiceDefinition").SetAccess(AccessType.Public)); codeBuilder.AddAssemblyRefence(Assembly.GetExecutingAssembly()) .AddAssemblyRefence(typeof(ServerServiceDefinition).Assembly) .AddAssemblyRefence(typeof(ServerServiceDefinition).Assembly) .AddAssemblyRefence(typeof(ServiceProviderServiceExtensions).Assembly) .AddAssemblyRefence(typeof(Console).Assembly) .AddAssemblyRefence(service.Assembly); codeBuilder.CreateClass(@class); classDescripterList.Add(@class); } if (options.IsGeneralProtoFile) { if (string.IsNullOrWhiteSpace(options.PackageName)) { options.PackageName = options.NamespaceName; } var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("syntax = \"proto3\";"); stringBuilder.AppendLine($@"option csharp_namespace = ""{options.NamespaceName}"";"); stringBuilder.AppendLine($"package {options.PackageName};\n"); stringBuilder.Append(protoServiceCode); stringBuilder.AppendLine(); var messageCode = protoMessageCode.ToString(); if (messageCode.Contains(".bcl.")) { protoMessageCode.Replace(".bcl.", ""); protoMessageCode.AppendLine(Bcl.Proto); } stringBuilder.Append(protoMessageCode); var path = $"{Environment.CurrentDirectory}/{options.NamespaceName}.proto"; if (File.Exists(path)) { File.Delete(path); } File.WriteAllText(path, stringBuilder.ToString()); _messages = null; } return(classDescripterList); }