/// <summary>
        /// 生成访问器(持久化)键名(借助访问器文件路径组合器支持访问器、设计时、连接字符串、租户隔离)。
        /// </summary>
        /// <param name="invokeTypeName">给定的调用类型名称。</param>
        /// <param name="accessorFilePath">给定的访问器(持久化)文件路径组合器。</param>
        /// <returns>返回字符串。</returns>
        public static string GenerateAccessorKey(string invokeTypeName,
                                                 FilePathCombiner accessorFilePath)
        {
            invokeTypeName.NotNull(nameof(invokeTypeName));
            accessorFilePath.NotNull(nameof(accessorFilePath));

            var sb = new StringBuilder();

            sb.Append(invokeTypeName);
            sb.Append(';');

            // 访问器文件路径组合器已作有效隔离
            sb.Append(accessorFilePath);

            return(sb.ToString());
        }
Beispiel #2
0
        public static FilePathCombiner CompileInFile(FilePathCombiner assemblyPath, IEnumerable <MetadataReference> references,
                                                     params string[] sourceCodes)
        {
            assemblyPath.NotNull(nameof(assemblyPath));

            var syntaxTrees    = sourceCodes.Select(s => SyntaxFactory.ParseSyntaxTree(s));
            var compileOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
            var compilation    = CSharpCompilation.Create(assemblyPath.FileName, syntaxTrees, references, compileOptions);

            using (var stream = File.OpenWrite(assemblyPath))
            {
                var result = compilation.Emit(stream);
                if (!result.Success)
                {
                    throw new InvalidOperationException($"Build failed. Diagnostics: {string.Join(Environment.NewLine, result.Diagnostics)}");
                }
            }

            return(assemblyPath);
        }