예제 #1
0
        public static void VerifyRoundTrip(
            MemoryStream peStream,
            MemoryStream?pdbStream,
            string assemblyFileName,
            IRebuildArtifactResolver rebuildArtifactResolver,
            CancellationToken cancellationToken = default)
        {
            using var peReader = new PEReader(peStream);
            var embeddedPdbReader = peReader.GetEmbeddedPdbMetadataReader();
            var portablePdbReader = pdbStream is not null?MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader() : null;

            Assert.True(embeddedPdbReader == null ^ portablePdbReader == null);

            var pdbReader          = embeddedPdbReader ?? portablePdbReader ?? throw ExceptionUtilities.Unreachable;
            var factory            = LoggerFactory.Create(configure => { });
            var logger             = factory.CreateLogger("RoundTripVerification");
            var optionsReader      = new CompilationOptionsReader(logger, pdbReader, peReader);
            var compilationFactory = CompilationFactory.Create(
                assemblyFileName,
                optionsReader);

            using var rebuildPeStream  = new MemoryStream();
            using var rebuildPdbStream = optionsReader.HasEmbeddedPdb ? null : new MemoryStream();
            var emitResult = compilationFactory.Emit(
                rebuildPeStream,
                rebuildPdbStream,
                rebuildArtifactResolver,
                cancellationToken);

            Assert.True(emitResult.Success);
            Assert.Equal(peStream.ToArray(), rebuildPeStream.ToArray());
            Assert.Equal(pdbStream?.ToArray(), rebuildPdbStream?.ToArray());
        }
예제 #2
0
        public (ImmutableArray <SyntaxTree> SyntaxTrees, ImmutableArray <MetadataReference> MetadataReferences) ResolveArtifacts(
            IRebuildArtifactResolver resolver,
            Func <string, SourceText, SyntaxTree> createSyntaxTreeFunc
            )
        {
            var syntaxTrees        = ResolveSyntaxTrees();
            var metadataReferences = ResolveMetadataReferences();

            return(syntaxTrees, metadataReferences);

            ImmutableArray <SyntaxTree> ResolveSyntaxTrees()
            {
                var sourceFileCount = GetSourceFileCount();
                var builder         = ImmutableArray.CreateBuilder <SyntaxTree>(sourceFileCount);

                foreach (var(documentHandle, sourceTextInfo) in GetSourceTextInfoCore())
                {
                    SourceText sourceText;
                    if (
                        ResolveEmbeddedSource(documentHandle, sourceTextInfo) is
                        { } embeddedSourceTextInfo
                        )
                    {
                        sourceText = embeddedSourceTextInfo.SourceText;
                    }
예제 #3
0
 public EmitResult Emit(
     Stream rebuildPeStream,
     Stream?rebuildPdbStream,
     IRebuildArtifactResolver rebuildArtifactResolver,
     CancellationToken cancellationToken)
 => Emit(
     rebuildPeStream,
     rebuildPdbStream,
     CreateCompilation(rebuildArtifactResolver),
     cancellationToken);
예제 #4
0
        public Compilation CreateCompilation(IRebuildArtifactResolver resolver)
        {
            var tuple = OptionsReader.ResolveArtifacts(resolver, CreateSyntaxTree);

            return(CreateCompilation(tuple.SyntaxTrees, tuple.MetadataReferences));
        }