Пример #1
0
        private static ScriptCompilationResult BuildScriptCompilationResult(AsmDetail detailsToUseForTarget, EmitResult emitResult,
                                                                            PreparedCompilation compilationPrep)
        {
            var result = new ScriptCompilationResult {
                CompilationResult = emitResult
            };

            if (emitResult.Diagnostics.Count(d => d.Severity == DiagnosticSeverity.Error) == 0)
            {
                result.IsCompiled       = true;
                result.AssemblyFilePath = detailsToUseForTarget.AsmPath;
                result.PdbFilePath      = detailsToUseForTarget.PdbPath;
                result.FoundNamespaces.AddRange(compilationPrep.Usings);
                result.FoundMetadataReferences.AddRange(compilationPrep.MetadataReferences);
            }

            return(result);
        }
Пример #2
0
        public static ScriptCompilationResult CompileAndWriteScript(SyntaxTree compilationSource, AsmDetail detailsToUseForTarget,
                                                                    IEnumerable <string> additionalUsings = null, IEnumerable <MetadataReference> additionalReferences = null)
        {
            var compilationPrep = PrepareScriptCompilation(compilationSource, detailsToUseForTarget, additionalUsings, additionalReferences);

            var emitResult = compilationPrep.Compilation.Emit(detailsToUseForTarget.AsmPath, detailsToUseForTarget.PdbPath);

            return(BuildScriptCompilationResult(detailsToUseForTarget, emitResult, compilationPrep));
        }
Пример #3
0
        public static ScriptCompilationResult CompileScript(ImmutableList <SyntaxTree> compilationSources, AsmDetail detailsToUseForTarget,
                                                            IEnumerable <string> additionalUsings = null, IEnumerable <MetadataReference> additionalReferences = null)
        {
            var compilationPrep = PrepareCompilation(compilationSources, detailsToUseForTarget, additionalUsings, additionalReferences);

            var scriptCompilation = new ScriptCompilationResult();

            using (var dllStream = new MemoryStream())
                using (var pdbStream = new MemoryStream())
                {
                    var emitResult = compilationPrep.Compilation.Emit(dllStream, pdbStream);

                    //success sometimes was false when there are warnings, but i didnt write it down
                    // so maybe it was a specific kind. Or I should pay more attention.
                    scriptCompilation.CompilationResult = emitResult;

                    if (emitResult.Diagnostics.Count(d => d.Severity == DiagnosticSeverity.Error) == 0)
                    {
                        scriptCompilation.IsCompiled = true;
                        dllStream.Seek(0, SeekOrigin.Begin);
                        pdbStream.Seek(0, SeekOrigin.Begin);
                        scriptCompilation.AssemblyBytes = dllStream.ToArray();
                        scriptCompilation.PdbBytes      = pdbStream.ToArray();

                        scriptCompilation.AssemblyFilePath = detailsToUseForTarget.AsmPath;
                        scriptCompilation.PdbFilePath      = detailsToUseForTarget.PdbPath;
                        scriptCompilation.FoundNamespaces.AddRange(compilationPrep.Usings);
                        scriptCompilation.FoundMetadataReferences.AddRange(compilationPrep.MetadataReferences);
                    }
                }
            return(scriptCompilation);
        }
Пример #4
0
        private static PreparedCompilation PrepareScriptCompilation(SyntaxTree compilationSource, AsmDetail detailsToUseForTarget,
                                                                    IEnumerable <string> additionalUsings = null, IEnumerable <MetadataReference> additionalReferences = null)
        {
            var commonDetails = BuildCommonCompilationDetails(additionalUsings, additionalReferences);

            var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
                          .WithUsings(commonDetails.ListOfUsings);

            var compilation = CSharpCompilation.CreateScriptCompilation(detailsToUseForTarget.AsmName)
                              //.WithReferences(commonDetails.MetadataReferences)
                              .AddReferences(commonDetails.MetadataReferences)
                              .WithOptions(options)
                              .AddSyntaxTrees(compilationSource);


            return(new PreparedCompilation
            {
                Options = options,
                Compilation = compilation,
                MetadataReferences = commonDetails.MetadataReferences,
                Usings = commonDetails.ListOfUsings
            });
        }
Пример #5
0
        private static PreparedCompilation PrepareCompilation(ImmutableList <SyntaxTree> compilationSources, AsmDetail detailsToUseForTarget,
                                                              IEnumerable <string> additionalUsings = null, IEnumerable <MetadataReference> additionalReferences = null, OutputKind?outputKind = null)
        {
            var commonDetails = BuildCommonCompilationDetails(additionalUsings, additionalReferences);

            var outputKindForOptions = OutputKind.DynamicallyLinkedLibrary;

            if (outputKind.HasValue)
            {
                outputKindForOptions = outputKind.Value;
            }

            var options = new CSharpCompilationOptions(outputKindForOptions)
                          .WithUsings(commonDetails.ListOfUsings)
                          .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);

            var compilation = CSharpCompilation.Create(detailsToUseForTarget.AsmName,
                                                       compilationSources.ToArray(), commonDetails.MetadataReferences);

            return(new PreparedCompilation
            {
                Options = options,
                Compilation = compilation,
                MetadataReferences = commonDetails.MetadataReferences,
                Usings = commonDetails.ListOfUsings
            });
        }
Пример #6
0
        public static ScriptCompilationResult GetCompilationForLoadDirective(CompileDirection compileDirection, string path, AsmDetail asmDetail,
                                                                             List <string> namespaces, IEnumerable <MetadataReference> metadataReferences)
        {
            var targetType            = GetResolutionTargetType(path);
            var referencedCompilation = new ScriptCompilationResult();

            if (compileDirection == CompileDirection.EverythingBuiltAsClassesAndReffed)
            {
                if (targetType == ResolutionTargetType.Cs)
                {
                    var compilationUnit = GetRootMainCompilationUnit(FileUtilities.GetFileContent(path), CsRewriter.DefaultParseOptions);
                    referencedCompilation = CompileAndWriteAssembly(ImmutableList.Create(compilationUnit.SyntaxTree),
                                                                    asmDetail, namespaces, metadataReferences);
                }
            }
            else //compileDirection == CompileDirection.OnlyClassesBuiltAsScriptsAndReffed
            {
                if (targetType == ResolutionTargetType.Cs)
                {
                    var extraction = CsRewriter.ExtractCompilationDetailFromClassFile(path);
                    referencedCompilation = CompileAndWriteScript(extraction.CompilationTargets.First(),
                                                                  asmDetail, namespaces, metadataReferences);
                }
                else
                {
                    var compilationUnit = GetRootMainCompilationUnit(FileUtilities.GetFileContent(path));
                    referencedCompilation = CompileAndWriteAssembly(ImmutableList.Create(compilationUnit.SyntaxTree),
                                                                    asmDetail, namespaces, metadataReferences);
                }
            }

            Debug.Assert(referencedCompilation != null, "load directive compilation should not be null",
                         $"path '{path}' - compileDirection {compileDirection} - targetType {targetType}\n\n\n");

            return(referencedCompilation);
        }
Пример #7
0
        /// <summary>
        ///     Compiles the and writes to a PE.
        /// </summary>
        /// <param name="compilationSources">The compilation sources.</param>
        /// <param name="detailsToUseForTarget">The details to use for target.</param>
        /// <param name="additionalUsings">The additional usings.</param>
        /// <param name="additionalReferences">The additional references.</param>
        /// <param name="outputKind">Defaults to Dll if not specified</param>
        /// <returns></returns>
        public static ScriptCompilationResult CompileAndWriteAssembly(ImmutableList <SyntaxTree> compilationSources, AsmDetail detailsToUseForTarget,
                                                                      IEnumerable <string> additionalUsings = null, IEnumerable <MetadataReference> additionalReferences = null,
                                                                      OutputKind?outputKind = null)
        {
            var compilationPrep = PrepareCompilation(compilationSources, detailsToUseForTarget, additionalUsings, additionalReferences, outputKind);

            var emitResult = compilationPrep.Compilation.Emit(detailsToUseForTarget.AsmPath, detailsToUseForTarget.PdbPath);

            return(BuildScriptCompilationResult(detailsToUseForTarget, emitResult, compilationPrep));
        }