public override Assembly CompileAssembly(out byte[] bytes)
        {
            RoslynCompiler compiler = new RoslynCompiler();

            foreach (Type type in Types)
            {
                compiler.AddAssemblyReference(type.Assembly.Location);
            }

            compiler.AddAssemblyReference(typeof(GraphType).Assembly.Location);

            bytes = compiler.Compile(AssemblyName ?? 8.RandomLetters(), new DirectoryInfo(SourceDirectoryPath));
            return(Assembly.Load(bytes));
        }
Пример #2
0
        public void Test()
        {
            string         toCompile = @"using System;
namespace Bam.Net.Dynamic
{
    public class WorkerPropertyResolver
    {
        public WorkState WorkState { get; set; }

        public Job Job { get; set; }

        public {{PropertyType}} Resolve()
        {
            return Resolve({{PropertyResolverLambda}});
        }

        public {{PropertyType}} Resolve(Func<WorkState, Job> propertyResolver)
        {
            return propertyResolver(WorkState, Job);
        }
    }
}";
            RoslynCompiler compiler  = new RoslynCompiler();

            compiler.AddAssemblyReference(
                "C:\\bam\\nuget\\global\\runtime.win-x64.microsoft.netcore.app\\2.2.2\\runtimes\\win-x64\\lib\\netcoreapp2.2\\Microsoft.CSharp.dll");
            compiler.AddAssemblyReference(typeof(ExpandoObject).Assembly.Location);
            compiler.AddAssemblyReference("C:\\bam\\nuget\\global\\runtime.win-x64.microsoft.netcore.app\\2.2.2\\runtimes\\win-x64\\lib\\netcoreapp2.2\\System.Runtime.dll");
            compiler.AddAssemblyReference("C:\\bam\\nuget\\global\\runtime.win-x64.microsoft.netcore.app\\2.2.2\\runtimes\\win-x64\\lib\\netcoreapp2.2\\System.Core.dll");
            byte[]   assBytes       = compiler.Compile(toCompile.Sha1(), toCompile);
            Assembly compiled       = Assembly.Load(assBytes);
            Type     dynamicContext = compiled.GetTypes().FirstOrDefault();
            object   instance       = dynamicContext.Construct();

            Expect.IsNotNull(dynamicContext);
            object output = instance.Invoke("Fun", (Func <string>)(() => "baloney"));

            Expect.IsNotNull(output);
            Console.WriteLine(output.ToString());
        }
Пример #3
0
        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);
            }
        }