Hi, Thank you so much for the reply. No i cant find it.
On Wednesday, May 18, 2016 at 1:49:45 PM UTC+5:30, [email protected] wrote: > > This works in Java, perhaps you can adapt it to C# (?) > https://github.com/os72/protobuf-dynamic > > Is there DynamicMessage in the C# API? > > On Monday, May 16, 2016 at 10:30:18 AM UTC-7, [email protected] wrote: >> >> Hi, >> >> I wanted to generate FileDescriptor dynamically from .proto without >> referencing, as in the given example we have reference Student.Interop.DTO >> so that we can get the StudentDTO.Descriptor and EmployeeDTO.Descriptor, so >> i wanted to avoid this reference. >> >> *Example :* >> namespace Student.WebApi >> { >> using System.Web.Http; >> using Framework.WebApi.Formatters; >> using Google.Protobuf.Reflection; >> using Repository; >> using Student.Interop.DTO; >> >> public class WebApiApplication : System.Web.HttpApplication >> { >> protected void Application_Start() >> { >> GlobalConfiguration.Configure(WebApiConfig.Register); >> var json = >> GlobalConfiguration.Configuration.Formatters.JsonFormatter; >> json.SerializerSettings.Converters.Add(new >> AnyJsonConverter(TypeRegistry.FromMessages(StudentDTO.Descriptor, >> EmployeeDTO.Descriptor))); >> >> } >> } >> } >> >> So to achieve this following few steps i tried : >> >> *Step 1* : Sample Proto i.e Student.proto which consist of message type >> i.e StudentDTO and EmployeeDTO >> >> syntax = "proto3"; >> package AnalysisConsoleApplication; >> import "google/protobuf/any.proto"; >> option csharp_namespace = "AnalysisConsoleApplication"; >> >> message StudentDTO >> { google.protobuf.Any Any = 1; >> string USN = 2; >> string Name = 3; >> string University = 4; >> } >> message EmployeeDTO >> { >> string Name = 1; >> string Gender = 2; >> } >> >> Step 2 : I generated Student.pb by using below command i.e >> >> .\protoc.exe --proto_path=D:\Proto Proto\Student.proto --include_imports >> --descriptor_set_out=D:\AnalysisConsoleApplication\Student.pb >> >> Step 3 : If i reference Google.Protobuf.3.0.0-beta2 in my >> SampleConsoleApplication and try to use FileDescriptor class then it will >> give error as recently in updated version FileDescriptor is of Internal >> sealed class. so i clone the Google.Protobuf repository which was of >> Google.Protobuf.3.0.0-beta2 release time, at that time FileDescriptor class >> was public sealed class. Now my SampleConsoleApplication solution will >> have another project which is of Google.Protobuf. >> >> Note: SampleConsoleApplication zip file is been attached for detail >> understanding. >> >> This code is from Actual generated C# file(Student.cs) from the given >> proto, but now next step we will create this below descriptorData >> dynamically >> from Student.pb >> byte[] descriptorData = global::System.Convert.FromBase64String( >> string.Concat( >> >> "Cg1TdHVkZW50LnByb3RvEhpBbmFseXNpc0NvbnNvbGVBcHBsaWNhdGlvbhoZ", >> >> "Z29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byJeCgpTdHVkZW50RFRPEiEKA0Fu", >> >> "eRgBIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnkSCwoDVVNOGAIgASgJEgwK", >> >> "BE5hbWUYAyABKAkSEgoKVW5pdmVyc2l0eRgEIAEoCSIrCgtFbXBsb3llZURU", >> >> "TxIMCgROYW1lGAEgASgJEg4KBkdlbmRlchgCIAEoCUIdqgIaQW5hbHlzaXND", >> "b25zb2xlQXBwbGljYXRpb25iBnByb3RvMw==")); >> descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, >> new pbr::FileDescriptor[] { >> global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, }, >> new pbr::GeneratedCodeInfo(null, new pbr::GeneratedCodeInfo[] { >> new >> pbr::GeneratedCodeInfo(typeof(global::AnalysisConsoleApplication.StudentDTO), >> >> global::AnalysisConsoleApplication.StudentDTO.Parser, new[]{ "Any", "USN", >> "Name", "University" }, null, null, null), >> new >> pbr::GeneratedCodeInfo(typeof(global::AnalysisConsoleApplication.EmployeeDTO), >> >> global::AnalysisConsoleApplication.EmployeeDTO.Parser, new[]{ "Name", >> "Gender" }, null, null, null) >> })); >> >> Step 4: Now to generate descriptorData dynamically from Student.pb, i >> have written the following code which gives the descriptorData in byte[] >> >> //get the path of Student.pb >> var path = string.Format("{0}/Student.pb", Path.GetDirectoryName(new >> Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath)); >> //create messageParser >> MessageParser<FileDescriptorSet> messageParser = new >> MessageParser<FileDescriptorSet>(() => new FileDescriptorSet()); >> // open and read it >> CodedInputStream stream = new CodedInputStream(new FileStream(path, >> FileMode.Open)); >> //Parses a message from the given coded input stream. >> var data = messageParser .ParseFrom(stream); >> //Covert to ByteString >> var descriptorData = data.File[0].ToByteString(); >> >> Step 5: Last step to generate filedescriptor by calling >> FileDescriptor.FromGeneratedCode() >> which accepts 3 parameters >> Parameter 1: byte[] descriptorData -> this parameter we are able to >> generate dynamically as done in step 4 i.e descriptorData.ToByteArray() >> >> Parameter 2: FileDescriptor[] dependencies-> this takes all the >> dependencies. >> Parameter 3: GeneratedCodeInfo generatedCodeInfo-> This has >> GeneratedCodeInfo(Type >> clrType, MessageParser parser, string[] propertyNames, string[] oneofNames, >> Type[] nestedEnums, GeneratedCodeInfo[] nestedTypes) out of this >> parameters i am not able to get clrtype dynamically. >> >> *Here is the brief example of what i am expecting:* >> typeof(global::SampleConsoleApplication.StudentDTO): this gives the type >> i.e clrtype of StudentDTO which is of public sealed class, which will be >> generated in Student.cs by executing the Student.proto. But I am trying to >> get the clrtype without generating Student.cs, so because of which >> typeof(global::SampleConsoleApplication.StudentDTO) >> can't be used here. >> >> >> -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
