private bool TryWritePortableExecutableReferenceBackedByTemporaryStorageTo(
            ISupportTemporaryStorage reference, ObjectWriter writer, CancellationToken cancellationToken)
        {
            if (_storageService == null)
            {
                return(false);
            }

            var storages = reference.GetStorages();

            if (storages == null)
            {
                return(false);
            }

            using (var pooled = Creator.CreateList <(string name, long offset, long size)>())
            {
                foreach (var storage in storages)
                {
                    var storage2 = storage as ITemporaryStorageWithName;
                    if (storage2 == null)
                    {
                        return(false);
                    }

                    pooled.Object.Add((storage2.Name, storage2.Offset, storage2.Size));
                }

                WritePortableExecutableReferenceHeaderTo((PortableExecutableReference)reference, SerializationKinds.MemoryMapFile, writer, cancellationToken);

                writer.WriteInt32((int)MetadataImageKind.Assembly);
                writer.WriteInt32(pooled.Object.Count);

                foreach (var tuple in pooled.Object)
                {
                    writer.WriteInt32((int)MetadataImageKind.Module);
                    writer.WriteString(tuple.name);
                    writer.WriteInt64(tuple.offset);
                    writer.WriteInt64(tuple.size);
                }

                return(true);
            }
        }
Пример #2
0
        private static bool TryWritePortableExecutableReferenceBackedByTemporaryStorageTo(
            ISupportTemporaryStorage reference, ObjectWriter writer, CancellationToken cancellationToken)
        {
            var storages = reference.GetStorages();

            if (storages == null)
            {
                return(false);
            }

            // Not clear if name should be allowed to be null here (https://github.com/dotnet/roslyn/issues/43037)
            using var pooled = Creator.CreateList <(string?name, long offset, long size)>();

            foreach (var storage in storages)
            {
                if (!(storage is ITemporaryStorageWithName storage2))
                {
                    return(false);
                }

                pooled.Object.Add((storage2.Name, storage2.Offset, storage2.Size));
            }

            WritePortableExecutableReferenceHeaderTo((PortableExecutableReference)reference, SerializationKinds.MemoryMapFile, writer, cancellationToken);

            writer.WriteInt32((int)MetadataImageKind.Assembly);
            writer.WriteInt32(pooled.Object.Count);

            foreach (var(name, offset, size) in pooled.Object)
            {
                writer.WriteInt32((int)MetadataImageKind.Module);
                writer.WriteString(name);
                writer.WriteInt64(offset);
                writer.WriteInt64(size);
            }

            return(true);
        }
        private bool TryWritePortableExecutableReferenceBackedByTemporaryStorageTo(
            ISupportTemporaryStorage reference, ObjectWriter writer, CancellationToken cancellationToken)
        {
            var storages = reference.GetStorages();
            if (storages == null)
            {
                return false;
            }

            using (var pooled = Creator.CreateList<ValueTuple<string, long>>())
            {
                foreach (var storage in storages)
                {
                    var storage2 = storage as ITemporaryStorageWithName;
                    if (storage2 == null)
                    {
                        return false;
                    }

                    pooled.Object.Add(ValueTuple.Create(storage2.Name, storage2.Size));
                }

                WritePortableExecutableReferenceHeaderTo((PortableExecutableReference)reference, SerializationKinds.MemoryMapFile, writer, cancellationToken);

                writer.WriteInt32((int)MetadataImageKind.Assembly);
                writer.WriteInt32(pooled.Object.Count);

                foreach (var tuple in pooled.Object)
                {
                    writer.WriteInt32((int)MetadataImageKind.Module);
                    writer.WriteString(tuple.Item1);
                    writer.WriteInt64(tuple.Item2);
                }

                return true;
            }
        }