private static void EnsureBaseType(string baseTypeName, string writeTo, HandlebarsTemplateRenderer renderer, CommandLineDelegatedClassModel model, HashSet <FileInfo> codeFiles) { FileInfo baseTypeCodeFile = new FileInfo(Path.Combine(writeTo, $"{baseTypeName}.cs")); string baseTypeCode = renderer.Render("ProviderBaseClass", model.ProviderBaseClass); baseTypeCode.SafeWriteToFile(baseTypeCodeFile.FullName, true); codeFiles.Add(baseTypeCodeFile); }
public override void Add(Action <string> output = null, Action <string> error = null) { try { HashSet <FileInfo> codeFiles = new HashSet <FileInfo>(); HandlebarsTemplateRenderer renderer = new HandlebarsTemplateRenderer(new HandlebarsEmbeddedResources(GetType().Assembly)); RoslynCompiler compiler = new RoslynCompiler(); ShellGenConfig config = GetConfig(); Type baseType = null; if (!Arguments.Contains("generateBaseType")) { Message("Searching current AppDomain for specified base type ({0})", output, config.BaseTypeName); foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { baseType = FindType(assembly, config.BaseTypeNamespace, config.BaseTypeName); if (baseType != null) { Message("Found base type ({0}) in assembly ({1})", output, config.BaseTypeName, assembly.FullName); break; } } } CommandLineDelegatedClassModel model = CommandLineDelegatedClassModel.Create(config.ConcreteTypeName, config.BaseTypeName); model.Namespace = config.Namespace; SetConcreteModelProperties(model.ConcreteClass, config); ShellDescriptor descriptor = new ShellDescriptor(); if (baseType != null) { descriptor = new ShellDescriptor(baseType); model.SetMethods(baseType.GetMethods().Where(m => m.IsAbstract).Select(m => m.Name).ToArray()); } else { model.SetMethods(GetArgument("methodNames", "Please enter the method names to define on the base type (comma separated).") .DelimitSplit(",")); compiler.AddAssemblyReference(typeof(IRegisterArguments)); EnsureBaseType(config.BaseTypeName, config.WriteTo, renderer, model, codeFiles); } model.SetBaseTypeName(config.BaseTypeName); GenerateDelegator(config.WriteTo, model.DelegatorClass, renderer, codeFiles); GenerateConcreteType(config.WriteTo, config.ConcreteTypeName, renderer, model.ConcreteClass, codeFiles); byte[] delegatorAssembly = compiler.Compile(config.ConcreteTypeName, codeFiles.ToArray()); descriptor = ShellGenerationRepository.Save(descriptor); ShellWrapperAssembly wrapperAssembly = new ShellWrapperAssembly { ShellDescriptorKey = descriptor.Key(), Base64Assembly = delegatorAssembly.ToBase64() }; ShellGenerationRepository.Save(wrapperAssembly); } catch (Exception ex) { error(ex.Message); Exit(1); } }