Exemple #1
0
        private void InitializeScopeReference(Cts.ModuleDesc module, ScopeReference scopeReference)
        {
            var assemblyDesc = module as Cts.IAssemblyDesc;

            if (assemblyDesc != null)
            {
                var assemblyName = assemblyDesc.GetName();

                scopeReference.Name           = HandleString(assemblyName.Name);
                scopeReference.Culture        = HandleString(assemblyName.CultureName);
                scopeReference.MajorVersion   = checked ((ushort)assemblyName.Version.Major);
                scopeReference.MinorVersion   = checked ((ushort)assemblyName.Version.Minor);
                scopeReference.BuildNumber    = checked ((ushort)assemblyName.Version.Build);
                scopeReference.RevisionNumber = checked ((ushort)assemblyName.Version.Revision);

                Debug.Assert((int)AssemblyFlags.PublicKey == (int)AssemblyNameFlags.PublicKey);
                Debug.Assert((int)AssemblyFlags.Retargetable == (int)AssemblyNameFlags.Retargetable);

                // References use a public key token instead of full public key.
                scopeReference.Flags = (AssemblyFlags)(assemblyName.Flags & ~AssemblyNameFlags.PublicKey);

                if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime)
                {
                    scopeReference.Flags |= (AssemblyFlags)((int)AssemblyContentType.WindowsRuntime << 9);
                }

                scopeReference.PublicKeyOrToken = assemblyName.GetPublicKeyToken();
            }
            else
            {
                throw new NotSupportedException("Multi-module assemblies");
            }
        }
        private Object ResolveAssemblyReference(ScopeReferenceHandle handle)
        {
            ScopeReference assemblyReference = _metadataReader.GetScopeReference(handle);

            AssemblyName an = new AssemblyName();

            an.Name        = _metadataReader.GetString(assemblyReference.Name);
            an.Version     = new Version(assemblyReference.MajorVersion, assemblyReference.MinorVersion, assemblyReference.BuildNumber, assemblyReference.RevisionNumber);
            an.CultureName = _metadataReader.GetString(assemblyReference.Culture) ?? "";

            var publicKeyOrToken = assemblyReference.PublicKeyOrToken.ConvertByteCollectionToArray();

            if ((assemblyReference.Flags & AssemblyFlags.PublicKey) != 0)
            {
                an.SetPublicKey(publicKeyOrToken);
            }
            else
            {
                an.SetPublicKeyToken(publicKeyOrToken);
            }

            // TODO: ContentType - depends on newer version of the System.Reflection contract

            return(Context.ResolveAssembly(an));
        }
Exemple #3
0
        private void CheckTypeReferenceForProperWinRTHome(TypeReference typeReference, string module)
        {
            ScopeReference scope = GetScopeReferenceOfType(typeReference);

            Assert.Equal(module, scope.Name.Value);
            int windowsRuntimeFlag = ((int)System.Reflection.AssemblyContentType.WindowsRuntime << 9);

            Assert.True((((int)scope.Flags) & windowsRuntimeFlag) == windowsRuntimeFlag);
        }
        private NamespaceReference HandleNamespaceReference(Cts.ModuleDesc parentScope, string namespaceString)
        {
            NamespaceReference result;
            NamespaceKey       key = new NamespaceKey(parentScope, namespaceString);

            if (_namespaceRefs.TryGetValue(key, out result))
            {
                return(result);
            }

            ScopeReference     scope = HandleScopeReference(parentScope);
            NamespaceReference rootNamespace;

            key = new NamespaceKey(parentScope, null);
            if (!_namespaceRefs.TryGetValue(key, out rootNamespace))
            {
                rootNamespace = new NamespaceReference
                {
                    Name = null,
                    ParentScopeOrNamespace = scope,
                };
                _namespaceRefs.Add(key, rootNamespace);
            }

            NamespaceReference currentNamespace     = rootNamespace;
            string             currentNamespaceName = String.Empty;

            foreach (var segment in namespaceString.Split('.'))
            {
                string nextNamespaceName = currentNamespaceName;
                if (nextNamespaceName.Length > 0)
                {
                    nextNamespaceName = nextNamespaceName + '.';
                }
                nextNamespaceName += segment;
                NamespaceReference nextNamespace;
                key = new NamespaceKey(parentScope, nextNamespaceName);
                if (!_namespaceRefs.TryGetValue(key, out nextNamespace))
                {
                    nextNamespace = new NamespaceReference
                    {
                        Name = HandleString(segment.Length == 0 ? null : segment),
                        ParentScopeOrNamespace = currentNamespace
                    };

                    _namespaceRefs.Add(key, nextNamespace);
                }
                currentNamespace     = nextNamespace;
                currentNamespaceName = nextNamespaceName;
            }

            return(currentNamespace);
        }
Exemple #5
0
        public ScopeReference GetScopeReferenceOfType(TypeReference typeReference)
        {
            Assert.NotNull(typeReference);
            ScopeReference     scope = null;
            NamespaceReference currentNamespaceReference = typeReference.ParentNamespaceOrType as NamespaceReference;

            while (scope == null)
            {
                Assert.NotNull(currentNamespaceReference);
                scope = currentNamespaceReference.ParentScopeOrNamespace as ScopeReference;
                currentNamespaceReference = currentNamespaceReference.ParentScopeOrNamespace as NamespaceReference;
            }

            return(scope);
        }
Exemple #6
0
        public static RuntimeAssemblyName ToRuntimeAssemblyName(this ScopeReferenceHandle scopeReferenceHandle, MetadataReader reader)
        {
            ScopeReference scopeReference = scopeReferenceHandle.GetScopeReference(reader);

            return(CreateRuntimeAssemblyNameFromMetadata(
                       reader,
                       scopeReference.Name,
                       scopeReference.MajorVersion,
                       scopeReference.MinorVersion,
                       scopeReference.BuildNumber,
                       scopeReference.RevisionNumber,
                       scopeReference.Culture,
                       scopeReference.PublicKeyOrToken,
                       scopeReference.Flags
                       ));
        }
Exemple #7
0
        public void ScopeReference()
        {
            var scopeProvider = ScopeProvider;
            var scope         = scopeProvider.CreateScope();
            var nested        = scopeProvider.CreateScope();

            Assert.IsNotNull(scopeProvider.AmbientScope);
            var scopeRef = new ScopeReference(scopeProvider);

            scopeRef.Dispose();
            Assert.IsNull(scopeProvider.AmbientScope);
            Assert.Throws <ObjectDisposedException>(() =>
            {
                var db = scope.Database;
            });
            Assert.Throws <ObjectDisposedException>(() =>
            {
                var db = nested.Database;
            });
        }
Exemple #8
0
        private void InitializeScopeReference(AssemblyName assemblyName, ScopeReference scopeReference)
        {
            scopeReference.Name           = HandleString(assemblyName.Name);
            scopeReference.Culture        = HandleString(assemblyName.CultureName);
            scopeReference.MajorVersion   = checked ((ushort)assemblyName.Version.Major);
            scopeReference.MinorVersion   = checked ((ushort)assemblyName.Version.Minor);
            scopeReference.BuildNumber    = checked ((ushort)assemblyName.Version.Build);
            scopeReference.RevisionNumber = checked ((ushort)assemblyName.Version.Revision);

            Debug.Assert((int)AssemblyFlags.PublicKey == (int)AssemblyNameFlags.PublicKey);
            Debug.Assert((int)AssemblyFlags.Retargetable == (int)AssemblyNameFlags.Retargetable);

            // References use a public key token instead of full public key.
            scopeReference.Flags = (AssemblyFlags)(assemblyName.Flags & ~AssemblyNameFlags.PublicKey);

            if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime)
            {
                scopeReference.Flags |= (AssemblyFlags)((int)AssemblyContentType.WindowsRuntime << 9);
            }

            scopeReference.PublicKeyOrToken = assemblyName.GetPublicKeyToken();
        }
        public static bool CompareScopeReferenceAcrossModules(ScopeReferenceHandle sr1, MetadataReader mr1, ScopeReferenceHandle sr2, MetadataReader mr2)
        {
            ScopeReference srData1 = mr1.GetScopeReference(sr1);
            ScopeReference srData2 = mr2.GetScopeReference(sr2);

            if (!srData1.Name.StringEquals(srData2.Name.GetConstantStringValue(mr2).Value, mr1))
            {
                return(false);
            }

            if (!srData1.Culture.StringEquals(srData2.Culture.GetConstantStringValue(mr2).Value, mr1))
            {
                return(false);
            }

            if (srData1.MajorVersion != srData2.MajorVersion)
            {
                return(false);
            }

            if (srData1.MinorVersion != srData2.MinorVersion)
            {
                return(false);
            }

            if (srData1.RevisionNumber != srData2.RevisionNumber)
            {
                return(false);
            }

            if (srData1.BuildNumber != srData2.BuildNumber)
            {
                return(false);
            }

            return(ComparePublicKeyOrTokens(srData1.PublicKeyOrToken, srData1.Flags.HasFlag(AssemblyFlags.PublicKey), srData2.PublicKeyOrToken, srData2.Flags.HasFlag(AssemblyFlags.PublicKey)));
        }
        public static bool CompareScopeReferenceToDefinition(ScopeReferenceHandle sr1, MetadataReader mr1, ScopeDefinitionHandle sd2, MetadataReader mr2)
        {
            ScopeReference  srData1 = mr1.GetScopeReference(sr1);
            ScopeDefinition sdData2 = mr2.GetScopeDefinition(sd2);

            if (!srData1.Name.StringEquals(sdData2.Name.GetConstantStringValue(mr2).Value, mr1))
            {
                return(false);
            }

            if (!srData1.Culture.StringEquals(sdData2.Culture.GetConstantStringValue(mr2).Value, mr1))
            {
                return(false);
            }

            if (srData1.MajorVersion != sdData2.MajorVersion)
            {
                return(false);
            }

            if (srData1.MinorVersion != sdData2.MinorVersion)
            {
                return(false);
            }

            if (srData1.RevisionNumber != sdData2.RevisionNumber)
            {
                return(false);
            }

            if (srData1.BuildNumber != sdData2.BuildNumber)
            {
                return(false);
            }

            return(true);
        }