Beispiel #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);
        }