示例#1
0
        /// <summary>
        /// 创建程序集
        /// </summary>
        /// <exception cref="Exception"></exception>
        /// <param name="messages">代码编译时的分析结果</param>
        public bool CreateDomain(out ImmutableArray <Diagnostic> messages)
        {
            HashSet <PortableExecutableReference> references = new HashSet <PortableExecutableReference>();

            if (_state.UseAutoAssembly)
            {
                _ = AppDomain.CurrentDomain.GetAssemblies()
                    .Where(i => !i.IsDynamic && !string.IsNullOrWhiteSpace(i.Location))
                    .Distinct()
                    .Select(i => MetadataReference.CreateFromFile(i.Location))
                    .Execute(item =>
                {
                    references.Add(item);
                });
            }

            _ = _state.Assemblies.Select(x => x.GetFiles()).Execute(item =>
            {
                item.Execute(file =>
                {
                    references.Add(MetadataReference.CreateFromStream(file));
                });
            });

            _option = _option ?? new DomainOptionBuilder();

            CSharpCompilationOptions options = _option.Build();

            SyntaxTree[] syntaxTrees = _state.Namespaces.Select(item => ParseToSyntaxTree(item.ToFullCode(), _option)).ToArray();

            var result = BuildCompilation(_state.Path, _state.AssemblyName, syntaxTrees, references.ToArray(), options);

            messages = result.Diagnostics;
            return(result.Success);
        }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="builder">编译配置器</param>
        /// <returns></returns>
        public CompilationBuilder WithOption(Action <DomainOptionBuilder> builder)
        {
            DomainOptionBuilder option = new DomainOptionBuilder();

            builder.Invoke(option);
            _option = option;
            return(this);
        }
示例#3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="option">编译配置</param>
 /// <returns></returns>
 public CompilationBuilder WithOption(DomainOptionBuilder option)
 {
     _option = option;
     return(this);
 }
示例#4
0
        private static SyntaxTree ParseToSyntaxTree(string code, DomainOptionBuilder option)
        {
            var parseOptions = new CSharpParseOptions(option.LanguageVersion, preprocessorSymbols: option.Environments);

            return(CSharpSyntaxTree.ParseText(code, parseOptions));
        }
示例#5
0
        /// <summary>
        /// 通过类构建器直接生成程序集
        /// </summary>
        /// <param name="builder">类构建器</param>
        /// <param name="assemblyPath">程序集路径</param>
        /// <param name="assemblyName">程序集名称</param>
        /// <param name="option">程序集配置</param>
        /// <param name="messages">编译时的消息</param>
        /// <returns></returns>
        public static bool CreateDomain(ClassBuilder builder, string assemblyPath, string assemblyName, DomainOptionBuilder option, out ImmutableArray <Diagnostic> messages)
        {
            HashSet <PortableExecutableReference> references = new HashSet <PortableExecutableReference>();

            _ = AppDomain.CurrentDomain.GetAssemblies()
                .Where(i => !i.IsDynamic && !string.IsNullOrWhiteSpace(i.Location))
                .Distinct()
                .Select(i => MetadataReference.CreateFromFile(i.Location))
                .Execute(item =>
            {
                references.Add(item);
            });

            CSharpCompilationOptions options = (option ?? new DomainOptionBuilder()).Build();

            var syntaxTree = ParseToSyntaxTree(builder.ToFullCode(), option);
            var result     = BuildCompilation(assemblyPath, assemblyName, new SyntaxTree[] { syntaxTree }, references.ToArray(), options);

            messages = result.Diagnostics;
            return(result.Success);
        }