public void TestSerializedSignatureWithReferenceToMDIntArray()
        {
            var typeInInitialContext = _context.GetWellKnownType(WellKnownType.Int32).MakeArrayType(3);

            // Create assembly with reference to interesting type
            TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new System.Reflection.AssemblyName("Lookup"), _context);
            var    token    = metadataEmitter.GetTypeRef(typeInInitialContext);
            Stream peStream = new MemoryStream();

            metadataEmitter.SerializeToStream(peStream);
            peStream.Seek(0, SeekOrigin.Begin);


            // Create new TypeSystemContext with just created assembly inside
            var lookupContext = new TestTypeSystemContext(TargetArchitecture.X64);
            var systemModule  = lookupContext.CreateModuleForSimpleName("CoreTestAssembly");

            lookupContext.SetSystemModule(systemModule);
            lookupContext.CreateModuleForSimpleName("Lookup", peStream);

            // Use generated assembly to trigger a load through the token created above and verify that it loads correctly
            var      ilLookupModule       = (EcmaModule)lookupContext.GetModuleForSimpleName("Lookup");
            TypeDesc int32ArrayFromLookup = ilLookupModule.GetType(token);
            var      typeInLookupContext  = lookupContext.GetWellKnownType(WellKnownType.Int32).MakeArrayType(3);

            Assert.Equal(typeInLookupContext, int32ArrayFromLookup);
        }
        public void TestSerializedSignatureWithArrayShapes()
        {
            MetadataType modOptTester = _testModule.GetType("", "ModOptTester");
            MethodDesc   methodWithInterestingShapes = modOptTester.GetMethods().Single(m => string.Equals(m.Name, "Method4"));

            // Create assembly with reference to interesting method
            TypeSystemMetadataEmitter metadataEmitter = new TypeSystemMetadataEmitter(new System.Reflection.AssemblyName("Lookup"), _context);
            var    token    = metadataEmitter.GetMethodRef(methodWithInterestingShapes);
            Stream peStream = new MemoryStream();

            metadataEmitter.SerializeToStream(peStream);
            peStream.Seek(0, SeekOrigin.Begin);


            // Create new TypeSystemContext with just created assembly inside
            var lookupContext = new TestTypeSystemContext(TargetArchitecture.X64);
            var systemModule  = lookupContext.CreateModuleForSimpleName("CoreTestAssembly");

            lookupContext.SetSystemModule(systemModule);

            lookupContext.CreateModuleForSimpleName("Lookup", peStream);

            // Use generated assembly to trigger a load through the token created above and verify that it loads correctly
            var        ilLookupModule = (EcmaModule)lookupContext.GetModuleForSimpleName("Lookup");
            MethodDesc method4        = ilLookupModule.GetMethod(token);

            Assert.Equal("Method4", method4.Name);
        }
Beispiel #3
0
            private void ResetEmitter()
            {
                _reader = null;
                AssemblyName assemblyName = new AssemblyName();

                assemblyName.Name    = _assemblyName;
                assemblyName.Version = _version;

                _currentBinaryEmitter = new ManagedBinaryEmitterForInternalUse(assemblyName, _module.Context, _assemblyFlags, _publicKeyArray, _hashAlgorithm, _moduleToIndex, _module);
                foreach (var entry in _values)
                {
                    var perMetadata = _perMetadata[entry.Item1];
                    var handle      = perMetadata.HandleGenerationFunction(_currentBinaryEmitter, entry.Item2);
                    Debug.Assert(handle == ExistingEntities[entry.Item2]);
                }
            }
Beispiel #4
0
 private int GetAssemblyRefHandle(TypeSystemMetadataEmitter emitter, object name)
 {
     return(MetadataTokens.GetToken(emitter.GetAssemblyRef((AssemblyName)name)));
 }
Beispiel #5
0
 private int GetUserStringHandle(TypeSystemMetadataEmitter emitter, object str)
 {
     return(MetadataTokens.GetToken(emitter.GetUserStringHandle((string)str)));
 }
Beispiel #6
0
 private int GetHandleForTypeSystemEntity(TypeSystemMetadataEmitter emitter, object type)
 {
     return(MetadataTokens.GetToken(emitter.EmitMetadataHandleForTypeSystemEntity((TypeSystemEntity)type)));
 }