public unsafe void NativeResources() { var peStream = new MemoryStream(); var ilBuilder = new BlobBuilder(); var metadataBuilder = new MetadataBuilder(); var peBuilder = new ManagedPEBuilder( PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(metadataBuilder), ilBuilder, nativeResources: new TestResourceSectionBuilder(), deterministicIdProvider: content => s_contentId); var peBlob = new BlobBuilder(); var contentId = peBuilder.Serialize(peBlob); peBlob.WriteContentTo(peStream); peStream.Position = 0; var peReader = new PEReader(peStream); var sectionHeader = peReader.PEHeaders.SectionHeaders.Single(s => s.Name == ".rsrc"); var image = peReader.GetEntireImage(); var reader = new BlobReader(image.Pointer + sectionHeader.PointerToRawData, sectionHeader.SizeOfRawData); Assert.Equal(0x12345678, reader.ReadInt32()); Assert.Equal(sectionHeader.PointerToRawData, reader.ReadInt32()); Assert.Equal(sectionHeader.VirtualAddress, reader.ReadInt32()); }
private static void WritePEImage( Stream peStream, MetadataBuilder metadataBuilder, BlobBuilder ilBuilder, MethodDefinitionHandle entryPointHandle, Blob mvidFixup = default(Blob), byte[] privateKeyOpt = null) { var peBuilder = new ManagedPEBuilder( entryPointHandle.IsNil ? PEHeaderBuilder.CreateLibraryHeader() : PEHeaderBuilder.CreateExecutableHeader(), new MetadataRootBuilder(metadataBuilder), ilBuilder, entryPoint: entryPointHandle, flags: CorFlags.ILOnly | (privateKeyOpt != null ? CorFlags.StrongNameSigned : 0), deterministicIdProvider: content => s_contentId); var peBlob = new BlobBuilder(); var contentId = peBuilder.Serialize(peBlob); if (!mvidFixup.IsDefault) { new BlobWriter(mvidFixup).WriteGuid(contentId.Guid); } if (privateKeyOpt != null) { peBuilder.Sign(peBlob, content => SigningUtilities.CalculateRsaSignature(content, privateKeyOpt)); } peBlob.WriteContentTo(peStream); }
public void ValidateFactoryMethods() { var peHeaderExe = PEHeaderBuilder.CreateExecutableHeader(); Assert.NotNull(peHeaderExe); Assert.True((peHeaderExe.ImageCharacteristics & Characteristics.ExecutableImage) != 0); var peHeaderLib = PEHeaderBuilder.CreateLibraryHeader(); Assert.NotNull(peHeaderLib); Assert.True((peHeaderLib.ImageCharacteristics & Characteristics.ExecutableImage) != 0); Assert.True((peHeaderLib.ImageCharacteristics & Characteristics.Dll) != 0); }
public void EmitToStream(Stream stream) { foreach (var typeDef in _emittedTypes) { MethodDefinitionHandle?firstMethodHandle = null; foreach (var methodDef in typeDef.Methods) { int bodyOffset = _methodBodyStream.AddMethodBody(methodDef.Code); BlobHandle signature = MakeSignatureHandle(methodDef.Signature); MethodDefinitionHandle methodHandle = _metadataBuilder.AddMethodDefinition( MethodAttributes.PrivateScope | MethodAttributes.Static, MethodImplAttributes.IL | MethodImplAttributes.Managed, _metadataBuilder.GetOrAddString(methodDef.Name), signature, bodyOffset, parameterList: default(ParameterHandle)); if (firstMethodHandle == null) { firstMethodHandle = methodHandle; } } _metadataBuilder.AddTypeDefinition( default(TypeAttributes), default(StringHandle), _metadataBuilder.GetOrAddString(typeDef.Name), typeDef.IsValueType ? MakeTypeRefHandle(_typeSystemContext.GetWellKnownType(WellKnownType.ValueType)) : MakeTypeRefHandle(_typeSystemContext.GetWellKnownType(WellKnownType.Object)), fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: firstMethodHandle.Value); } BlobBuilder peBlob = new BlobBuilder(); new ManagedPEBuilder(PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(_metadataBuilder), _methodBodyStream.Builder).Serialize(peBlob); peBlob.WriteContentTo(stream); // Clear some variables to catch any caller trying to emit data after writing the output file _emittedTypes = null; _metadataBuilder = null; _methodBodyStream = default(MethodBodyStreamEncoder); }
public void BlahBlahBlah() { var peHeader = PEHeaderBuilder.CreateLibraryHeader(); var meta = new MetadataBuilder(); var module = meta.AddModule(1, meta.GetOrAddString("Module1"), meta.GetOrAddGuid(Guid.Parse("11112222-3333-4444-5555-666677778888")), meta.GetOrAddGuid(Guid.Parse("88887777-6666-5555-4444-333322221111")), meta.GetOrAddGuid(Guid.Parse("22223333-4444-5555-6666-777788889999")) ); var tObject = meta.AddTypeReference( EntityHandle.ModuleDefinition, meta.GetOrAddString("System"), meta.GetOrAddString("Object")); var fields = new FieldDefinitionHandle(); //EMPTY!! var methods = new MethodDefinitionHandle(); //EMPTY!! meta.AddTypeDefinition( TypeAttributes.Class | TypeAttributes.Public, meta.GetOrAddString("Namespace1"), meta.GetOrAddString("Class1"), tObject, fields, methods); meta.GetOrAddString("Module1"); var metadataRoot = new MetadataRootBuilder(meta); var ilBlob = new BlobBuilder(); ilBlob.WriteByte(0); ilBlob.WriteByte(42); var pe = new ManagedPEBuilder(peHeader, metadataRoot, ilBlob); var blob = new BlobBuilder(); pe.Serialize(blob); Assembly.Load(blob.ToArray()); }
public unsafe void NativeResources_BadImpl() { var peStream = new MemoryStream(); var ilBuilder = new BlobBuilder(); var metadataBuilder = new MetadataBuilder(); var peBuilder = new ManagedPEBuilder( PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(metadataBuilder), ilBuilder, nativeResources: new BadResourceSectionBuilder(), deterministicIdProvider: content => s_contentId); var peBlob = new BlobBuilder(); Assert.Throws <NotImplementedException>(() => peBuilder.Serialize(peBlob)); }
public static byte[] BuildPEWithDebugDirectory(DebugDirectoryBuilder debugDirectoryBuilder) { var peStream = new MemoryStream(); var ilBuilder = new BlobBuilder(); var metadataBuilder = new MetadataBuilder(); var peBuilder = new ManagedPEBuilder( PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(metadataBuilder), ilBuilder, debugDirectoryBuilder: debugDirectoryBuilder); var peImageBuilder = new BlobBuilder(); peBuilder.Serialize(peImageBuilder); return(peImageBuilder.ToArray()); }
public override ConstraintResult ApplyTo <TActual>(TActual actual) { string actualContract; switch (actual) { case string sourceCode: actualContract = isVisualBasic ? AssemblyUtils.GenerateContract(generator, sourceCode, Microsoft.CodeAnalysis.VisualBasic.LanguageVersion.Latest, assemblyResolver) : AssemblyUtils.GenerateContract(generator, sourceCode, Microsoft.CodeAnalysis.CSharp.LanguageVersion.Latest, assemblyResolver); break; case Compilation compilation: using (var stream = new MemoryStream()) { AssemblyUtils.EmitCompilation(compilation, stream); stream.Seek(0, SeekOrigin.Begin); actualContract = AssemblyUtils.GenerateContract(generator, stream, assemblyResolver); } break; case MetadataBuilder metadataBuilder: var blobBuilder = new BlobBuilder(); var peBuilder = new ManagedPEBuilder( PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(metadataBuilder), ilStream: new BlobBuilder()); peBuilder.Serialize(blobBuilder); using (var stream = new MemoryStream(blobBuilder.ToArray(), writable: false)) actualContract = AssemblyUtils.GenerateContract(generator, stream, assemblyResolver); break; default: throw new ArgumentException("Expected source code as string or library IL as MetadataBuilder.", nameof(actual)); } return(new ContractConstraintResult(this, actualContract, expected)); }
private static void WritePEImage( Stream peStream, MetadataBuilder metadataBuilder, BlobBuilder ilBuilder, MethodDefinitionHandle entryPointHandle, byte[] privateKeyOpt = null) { var mappedFieldDataBuilder = new BlobBuilder(); var managedResourceDataBuilder = new BlobBuilder(); var peBuilder = new ManagedPEBuilder( entryPointHandle.IsNil ? PEHeaderBuilder.CreateLibraryHeader() : PEHeaderBuilder.CreateExecutableHeader(), new TypeSystemMetadataSerializer(metadataBuilder, "v4.0.30319", isMinimalDelta: false), ilBuilder, mappedFieldDataBuilder, managedResourceDataBuilder, nativeResourceSectionSerializer: null, strongNameSignatureSize: 128, entryPoint: entryPointHandle, pdbPathOpt: null, nativePdbContentId: default(ContentId), portablePdbContentId: default(ContentId), corFlags: CorFlags.ILOnly | (privateKeyOpt != null ? CorFlags.StrongNameSigned : 0), deterministicIdProvider: content => s_contentId); var peBlob = new BlobBuilder(); ContentId contentId; peBuilder.Serialize(peBlob, out contentId); if (privateKeyOpt != null) { peBuilder.Sign(peBlob, content => SigningUtilities.CalculateRsaSignature(content, privateKeyOpt)); } peBlob.WriteContentTo(peStream); }
public byte[] GenerateAssemblyBytes() { var name = _currentAssembly.GetName(); var assemblyHandle = _metadataBuilder.AddAssembly( GetString(name.Name), name.Version, GetString(name.CultureName), GetBlob(name.GetPublicKey()), _assemblyNameFlagsConvert(name.Flags), _assemblyHashAlgorithmConvert(name.HashAlgorithm)); CreateReferencedAssemblies(_currentAssembly.GetReferencedAssemblies()); CreateCustomAttributes(assemblyHandle, _currentAssembly.GetCustomAttributesData()); CreateModules(_currentAssembly.GetModules()); CreateTypes(_currentAssembly.GetTypes()); var entryPoint = GetMethodDefinitionHandle(_currentAssembly.EntryPoint); var metadataRootBuilder = new MetadataRootBuilder(_metadataBuilder); var header = PEHeaderBuilder.CreateLibraryHeader(); var peBuilder = new ManagedPEBuilder( header, metadataRootBuilder, _ilBuilder, debugDirectoryBuilder: _debugDirectoryBuilder, entryPoint: entryPoint); var peImageBuilder = new BlobBuilder(); peBuilder.Serialize(peImageBuilder); return(peImageBuilder.ToArray()); }