ProtobufGenerator.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. using Microsoft.VisualStudio.TextTemplating.VSHost;
  6. using EnvDTE;
  7. using Process = System.Diagnostics.Process;
  8. namespace ProtobufTool
  9. {
  10. [ComVisible(true)]
  11. [Guid("9cf79956-6dfb-4d5b-8d29-7b43f7306acf")]
  12. public class ProtobufGenerator : BaseCodeGeneratorWithSite
  13. {
  14. public override string GetDefaultExtension()
  15. {
  16. return ".pb.cs";
  17. }
  18. protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
  19. {
  20. using (var stream = File.Open("E:\\ProtobufTool.log", FileMode.OpenOrCreate))
  21. using (var streamWriter = new StreamWriter(stream))
  22. {
  23. streamWriter.WriteLine("input: {0}\r\n {1}", inputFileName, inputFileContent);
  24. var processStartInfo = new ProcessStartInfo("protogen.exe")
  25. {
  26. CreateNoWindow = true,
  27. WindowStyle = ProcessWindowStyle.Hidden,
  28. };
  29. var projectItem = this.GetService(typeof(ProjectItem)) as ProjectItem;
  30. processStartInfo.WorkingDirectory = Path.GetDirectoryName(projectItem.ContainingProject.FullName);
  31. streamWriter.WriteLine("WorkingDirectory: {0}", processStartInfo.WorkingDirectory);
  32. processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  33. var tempFile = Path.GetTempFileName();
  34. processStartInfo.Arguments = string.Format(
  35. "-i:{0} -o:{1} -q -t:csharp", inputFileName, tempFile);
  36. streamWriter.WriteLine("Arguments: {0}", processStartInfo.Arguments);
  37. using (var process = Process.Start(processStartInfo))
  38. {
  39. process.WaitForExit();
  40. streamWriter.WriteLine("return code: {0}", process.ExitCode);
  41. }
  42. byte[] bytes = File.ReadAllBytes(tempFile);
  43. File.Delete(tempFile);
  44. return bytes;
  45. }
  46. }
  47. }
  48. }