/// <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); }
/// <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); }
/// <summary> /// /// </summary> /// <param name="option">编译配置</param> /// <returns></returns> public CompilationBuilder WithOption(DomainOptionBuilder option) { _option = option; return(this); }
private static SyntaxTree ParseToSyntaxTree(string code, DomainOptionBuilder option) { var parseOptions = new CSharpParseOptions(option.LanguageVersion, preprocessorSymbols: option.Environments); return(CSharpSyntaxTree.ParseText(code, parseOptions)); }
/// <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); }