コード例 #1
0
 /// <summary>
 /// Returns the original location of the corresponding assembly if available, otherwise returns the location of the shadow copy.
 /// If the corresponding assembly is not in the GAC, null is returned.
 /// </summary>
 public static string GetLocation(AssemblyReference assemblyReference){
   if (assemblyReference == null) { Debug.Fail("assemblyReference == null"); return null; }
   lock(GlobalAssemblyCache.Lock){
     if (!GlobalAssemblyCache.FusionLoaded){
       GlobalAssemblyCache.FusionLoaded = true;
       System.Reflection.Assembly systemAssembly = typeof(object).Assembly;
       //^ assume systemAssembly != null && systemAssembly.Location != null;
       string dir = Path.GetDirectoryName(systemAssembly.Location);
       //^ assume dir != null;
       GlobalAssemblyCache.LoadLibrary(Path.Combine(dir, "fusion.dll"));
     }
     IAssemblyEnum assemblyEnum;
     CreateAssemblyEnum(out assemblyEnum, null, null, ASM_CACHE.GAC, 0);
     if (assemblyEnum == null) return null;
     IApplicationContext applicationContext;
     IAssemblyName currentName;
     while (assemblyEnum.GetNextAssembly(out applicationContext, out currentName, 0) == 0){
       //^ assume currentName != null;
       AssemblyName aName = new AssemblyName(currentName);
       if (assemblyReference.Matches(aName.Name, aName.Version, aName.Culture, aName.PublicKeyToken)){
         string codeBase = aName.CodeBase;
         if (codeBase != null && codeBase.StartsWith("file:///"))
           return codeBase.Substring(8);
         return aName.GetLocation();
       }
     }
     return null;
   }
 }
コード例 #2
0
 public AssemblyReference ImportAssembly(IAssemblyDescriptor assemblyInfo)
 {
     var table = _tableStreamBuffer.GetTable<AssemblyReference>();
     var reference = table.FirstOrDefault(x => _signatureComparer.MatchAssemblies(x, assemblyInfo));
     if (reference == null)
         table.Add(reference = new AssemblyReference(assemblyInfo));
     return reference;
 }
コード例 #3
0
 internal static CilAssemblyReference Create(AssemblyReference assemblyRef, int token, ref CilReaders readers, CilAssembly assemblyDefinition)
 {
     CilAssemblyReference assembly = new CilAssemblyReference();
     assembly._assemblyRef = assemblyRef;
     assembly._token = token;
     assembly._readers = readers;
     assembly._assemblyDefinition = assemblyDefinition;
     return assembly;
 }
コード例 #4
0
        private Tuple<SemanticVersion, string> ResolveAssembly(DllReference parentAssembly, AssemblyReference assemblyDependency)
        {
            var assemblies = _assemblyCacheService.Assemblies;
            var conflictingAssemblies = _assemblyCacheService.ConflictingAssemblies;

            //RULE 1. It's an assembly that is known on nuget.org or other. Official or Snapshot doesn't matter
            if(_resolutionLevel!=ResolutionLevelEnum.DontResolveDependancyUsingOfficialRepository)
            {
                var nugetPackage = _mappingService.GetNuGetPackage(_assemblyCacheService, assemblyDependency);
                if (nugetPackage != null)
                {
                    Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found in official repository as {nugetPackage.Item2}-{nugetPackage.Item1}");
                    return nugetPackage;
                }
            }

            //RULE 2. The reference is not known but it match with at least one dll present on local folder
            var resolvedAssembly = new Tuple<SemanticVersion, string>(new SemanticVersion(assemblyDependency.Item1), assemblyDependency.Item2);
            if (_assemblyCacheService.Assemblies.ContainsKey(resolvedAssembly) 
                                    && conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) == 1)
            {
                Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found at {assemblies[resolvedAssembly].Path}");
                return assemblies[resolvedAssembly].Id;
            }

            if (conflictingAssemblies.ContainsKey(assemblyDependency)
                                && conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) > 1
                                && _resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringMultipleAssembliesWithSameVersion)
                // there might be more than one dll with the expected version...Try to find the best one...
                resolvedAssembly = RetrieveConflictingDependancyFromCacheOrResolve(assemblies, parentAssembly, conflictingAssemblies[assemblyDependency], assemblyDependency);
            

            // RULE 3. Let's try to find if there is a snapshot or a equivalent Version (build number mistmatch only) 
            if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringBuildNumber)
            {
                var resolvedpackage = CompatibleBuild(assemblyDependency, assemblies, resolvedAssembly);
                if (resolvedpackage != null)
                    return resolvedpackage;
            }


            // RULE 4. Let's try to find if there is Higher Version (Patch & Build only) and take it only if there is only one possibility
            if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringPatchAndBuildNumber)
            {
                var resolvedpackage = ComptiblePathAndBuild(assemblyDependency, assemblies, resolvedAssembly);
                if (resolvedpackage != null)
                    return resolvedpackage;
            }

            Trace.TraceError($"Unable to find dependency {assemblyDependency.Item2}, {assemblyDependency.Item1}");
            if(_useCache)
                _dependencies.AddUnresolvedDependencies(assemblyDependency);

            return null;

        }
コード例 #5
0
        public void specific_version_should_serialize_using_boolean_string_that_matches_visual_studio_behaviour()
        {
            var reference = new AssemblyReference("log4net");
            var element = new XmlDocument().CreateElement("Reference");
            reference.Configure(new MSBuildItemGroup(new MSBuildProject(), element));

            reference.SpecificVersion = false;
            reference.Save();

            element.GetElementsByTagName("SpecificVersion")[0].InnerText.ShouldEqual("False"); // and not "false"
        }
コード例 #6
0
        public void AddUnresolvedDependencies(AssemblyReference parentAssembly)
        {
            var parser = new FileIniDataParser();
            var versionsFileData = new IniData();

            if (!Directory.Exists(@"cache\unresolved"))
                Directory.CreateDirectory(@"cache\unresolved");

            var file = @"cache\unresolved\" + parentAssembly.Item2 + _sectionSeparator + parentAssembly.Item1 + ".ini";
            if (File.Exists(file))
                return;

            parser.WriteFile(file, versionsFileData);
        }
コード例 #7
0
        public Tuple<SemanticVersion, string> GetDependencyFromCacheOrResolve(DllReference parentAssembly, AssemblyReference assemblyDependency)
        {
            //RULE 0. it's already in cache
            Tuple<SemanticVersion, string> cachedDependancy = null;
            if(_useCache)
                cachedDependancy = _dependencies.Load(parentAssembly, assemblyDependency.Item2);
            if (cachedDependancy != null)
                return cachedDependancy;

            var assembly = ResolveAssembly(parentAssembly, assemblyDependency);

            if (assembly!=null && _useCache)
                _dependencies.Save(assembly.Item1, assembly.Item2, parentAssembly);

            return assembly;
        }
コード例 #8
0
        public async Task <AssemblyReference[]> ResolveAssemblyReferences(ProjectConfigurationInfo[] configurations, Dictionary <string, string> globalProperties, MSBuildProject project, CancellationToken cancellationToken)
        {
            AssemblyReference[] refs = null;
            var id = configurations [0].Configuration + "|" + configurations [0].Platform;

            using (await referenceCacheLock.EnterAsync().ConfigureAwait(false)) {
                // Check the cache before starting the task
                if (referenceCache.TryGetValue(id, out refs))
                {
                    return(refs);
                }

                // Get an id for the task, it will be used later on to cancel the task if necessary
                var         taskId = Interlocked.Increment(ref lastTaskId);
                IDisposable cr     = RegisterCancellation(cancellationToken, taskId);

                MSBuildResult result;
                try {
                    BeginOperation();
                    result = await builder.Run(
                        configurations, -1, MSBuildEvent.None, MSBuildVerbosity.Quiet,
                        new [] { "ResolveAssemblyReferences" }, new [] { "ReferencePath" }, null, globalProperties, taskId
                        ).ConfigureAwait(false);
                } catch (Exception ex) {
                    await CheckDisconnected().ConfigureAwait(false);

                    LoggingService.LogError("ResolveAssemblyReferences failed", ex);
                    return(new AssemblyReference [0]);
                } finally {
                    cr.Dispose();
                    EndOperation();
                }

                MSBuildEvaluatedItem[] items;
                if (result.Items.TryGetValue("ReferencePath", out items) && items != null)
                {
                    refs = items.Select(it => CreateAssemblyReference(it, project)).ToArray();
                }
                else
                {
                    refs = new AssemblyReference [0];
                }

                referenceCache [id] = refs;
            }
            return(refs);
        }
コード例 #9
0
        public virtual Win32Assembly Resolve(AssemblyReference reference)
        {
            Win32Assembly resolvedAssembly = null;
            string        name             = reference.Name;

            if (reference.HasImage && !string.IsNullOrEmpty(reference.NETHeader.ParentAssembly.Path))
            {
                // Check directory of container assembly.
                TryGetAssembly(Path.GetDirectoryName(reference.NETHeader.ParentAssembly.Path), name, out resolvedAssembly);
            }

            if (resolvedAssembly == null)
            {
                // Check gac directories.
                if (!TryGetAssemblyGac(Path.Combine(_gacDirectory, "GAC_64"), name, out resolvedAssembly))
                {
                    if (!TryGetAssemblyGac(Path.Combine(_gacDirectory, "GAC_32"), name, out resolvedAssembly))
                    {
                        TryGetAssemblyGac(Path.Combine(_gacDirectory, "GAC_MSIL"), name, out resolvedAssembly);
                    }
                }
            }

            if (resolvedAssembly == null)
            {
                // Check search directories
                foreach (var directory in SearchDirectories)
                {
                    if (TryGetAssembly(directory, name, out resolvedAssembly))
                    {
                        break;
                    }
                }
            }

            if (resolvedAssembly == null)
            {
                OnResolutionFailed(reference);
            }

            if (resolvedAssembly != null)
            {
                _assemblyCache.Add(reference.Name, resolvedAssembly);
            }

            return(resolvedAssembly);
        }
コード例 #10
0
        /// <summary>
        /// Returns the original location of the corresponding assembly if available, otherwise returns the location of the shadow copy.
        /// If the corresponding assembly is not in the GAC, null is returned.
        /// </summary>
        public static string GetLocation(AssemblyReference assemblyReference)
        {
#if CodeContracts
            if (!probeGAC)
            {
                return(null);
            }
#endif
            if (assemblyReference == null)
            {
                Debug.Fail("assemblyReference == null"); return(null);
            }
            lock (GlobalAssemblyCache.Lock){
                if (!GlobalAssemblyCache.FusionLoaded)
                {
                    GlobalAssemblyCache.FusionLoaded = true;
                    System.Reflection.Assembly systemAssembly = typeof(object).Assembly;
                    //^ assume systemAssembly != null && systemAssembly.Location != null;
                    string dir = Path.GetDirectoryName(systemAssembly.Location);
                    //^ assume dir != null;
                    GlobalAssemblyCache.LoadLibrary(Path.Combine(dir, "fusion.dll"));
                }
                IAssemblyEnum assemblyEnum;
                CreateAssemblyEnum(out assemblyEnum, null, null, ASM_CACHE.GAC, 0);
                if (assemblyEnum == null)
                {
                    return(null);
                }
                IApplicationContext applicationContext;
                IAssemblyName       currentName;
                while (assemblyEnum.GetNextAssembly(out applicationContext, out currentName, 0) == 0)
                {
                    //^ assume currentName != null;
                    AssemblyName aName = new AssemblyName(currentName);
                    if (assemblyReference.Matches(aName.Name, aName.Version, aName.Culture, aName.PublicKeyToken))
                    {
                        string codeBase = aName.CodeBase;
                        if (codeBase != null && codeBase.StartsWith("file:///"))
                        {
                            return(codeBase.Substring(8));
                        }
                        return(aName.GetLocation());
                    }
                }
                return(null);
            }
        }
コード例 #11
0
        /// <summary>
        /// Returns a RoAssemblyName corresponding to the assembly reference.
        /// </summary>
        public static RoAssemblyName ToRoAssemblyName(this AssemblyReferenceHandle h, MetadataReader reader)
        {
            AssemblyReference a       = h.GetAssemblyReference(reader);
            string            name    = a.Name.GetString(reader);
            Version           version = a.Version.AdjustForUnspecifiedVersionComponents();
            string            culture = a.Culture.GetStringOrNull(reader);

            byte[]        pkOrPkt = a.PublicKeyOrToken.GetBlobBytes(reader);
            AssemblyFlags flags   = a.Flags;

            if ((flags & AssemblyFlags.PublicKey) != 0)
            {
                pkOrPkt = pkOrPkt.ComputePublicKeyToken();
            }

            return(new RoAssemblyName(name, version, culture, pkOrPkt));
        }
コード例 #12
0
        private static bool IsNonDefaultIncludedAssemblyReference(AssemblyReference assemblyReference)
        {
            var name = assemblyReference.Include;

            return(!new[]
            {
                "System",
                "System.Core",
                "System.Data",
                "System.Drawing",
                "System.IO.Compression.FileSystem",
                "System.Numerics",
                "System.Runtime.Serialization",
                "System.Xml",
                "System.Xml.Linq"
            }.Contains(name));
        }
コード例 #13
0
        internal void RemoveAssemblyFromSet(string assembly)
        {
            AssemblyReference toRemove = null;

            foreach (AssemblyReference reference in this.TextExpressionReferences)
            {
                if (reference.AssemblyName.Name == assembly)
                {
                    toRemove = reference;
                    break;
                }
            }
            if (toRemove != null)
            {
                this.TextExpressionReferences.Remove(toRemove);
            }
        }
コード例 #14
0
        public void can_write_and_read_display_name()
        {
            var project = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                DisplayName = "some name"
            };

            project.Add<AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find<AssemblyReference>("Foo")
                .DisplayName.ShouldEqual("some name");
        }
コード例 #15
0
        public void can_write_and_read_Aliases()
        {
            var project = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                Aliases = "some alias"
            };

            project.Add<AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find<AssemblyReference>("Foo")
                .Aliases.ShouldEqual("some alias");
        }
コード例 #16
0
        private AssemblyReference ToReference(string assemblyName, Assembly ownerAssembly)
        {
            var assemblyRef = ownerAssembly.AssemblyReferences.Find(assemblyName, true);

            if (assemblyRef != null)
            {
                return(assemblyRef);
            }

            var mscorlibRef = AssemblyReference.GetMscorlib(ownerAssembly);

            return(new AssemblyReference(
                       assemblyName,
                       CodeModelUtils.NeutralCulture,
                       mscorlibRef.Version,
                       MicrosoftNetFramework.BclPublicKeyToken));
        }
コード例 #17
0
        protected internal AssemblyReference AddAssemblyNameFromItem(ITaskItem item, AssemblyReferenceType referenceType)
        {
            AssemblyReference assembly = new AssemblyReference {
                AssemblyIdentity = AssemblyIdentity.FromAssemblyName(item.ItemSpec),
                ReferenceType    = referenceType
            };

            this.manifest.AssemblyReferences.Add(assembly);
            string metadata = item.GetMetadata("HintPath");

            if (!string.IsNullOrEmpty(metadata))
            {
                assembly.SourcePath = metadata;
            }
            this.SetItemAttributes(item, assembly);
            return(assembly);
        }
コード例 #18
0
 private AssemblyRefRow CreateAssemblyRefRow(AssemblyReference entity, MetadataBuilder metadata)
 {
     return(new AssemblyRefRow(
                (ushort)entity.Version.Major,
                (ushort)entity.Version.Minor,
                (ushort)entity.Version.Build,
                (ushort)entity.Version.Revision,
                entity.Attributes,
                metadata.WriteBlob(
                    entity.PublicKeyToken.IsNullOrEmpty()
                 ? entity.PublicKey
                 : entity.PublicKeyToken),
                metadata.WriteString(entity.Name),
                metadata.WriteString(entity.Culture),
                metadata.WriteBlob(entity.Hash)
                ));
 }
コード例 #19
0
        private void LoadProjectReferences(ProjectElement result, MsBuildProjectLoader msBuildLoader, Hashtable projects)
        {
            IEnumerable <BuildItem> projectReferenceItems = msBuildLoader.GetProjectItems(STR_ProjectReference);

            foreach (BuildItem item in projectReferenceItems)
            {
                string      prj         = item.GetMetadata(STR_Project);
                ProjectInfo projectInfo = projects[prj] as ProjectInfo;
                if (projectInfo == null)
                {
                    continue;
                }
                AssemblyReference projectRef = new AssemblyReference(String.Empty);
                projectRef.SetSourceProjectFullName(projectInfo.FilePath);
                result.AddReference(projectRef);
            }
        }
コード例 #20
0
        public void ResolveCorLibUsingFileService()
        {
            using var service = new ByteArrayFileService();

            var assemblyName = typeof(object).Assembly.GetName();
            var assemblyRef  = new AssemblyReference(
                assemblyName.Name,
                assemblyName.Version,
                false,
                assemblyName.GetPublicKeyToken());

            var resolver = new DotNetCoreAssemblyResolver(service, new Version(3, 1, 0));

            Assert.Empty(service.GetOpenedFiles());
            Assert.NotNull(resolver.Resolve(assemblyRef));
            Assert.NotEmpty(service.GetOpenedFiles());
        }
コード例 #21
0
        public void ImportNewAssembly()
        {
            var assembly    = Utilities.CreateTempNetAssembly();
            var tableStream = assembly.NetDirectory.MetadataHeader.GetStream <TableStream>();
            var refTable    = tableStream.GetTable <AssemblyReference>();
            var importer    = new ReferenceImporter(tableStream);

            const string assemblyName = "some_lib";
            var          version      = new Version(1, 2, 3, 4);

            var reference    = new AssemblyReference(assemblyName, version);
            var newReference = importer.ImportAssembly(new AssemblyReference(assemblyName, version));

            Assert.AreNotSame(reference, newReference, "Imported reference is same object as original.");
            Assert.IsTrue(refTable.Contains(newReference), "Imported reference not added to reference table.");
            Assert.IsTrue(_comparer.MatchAssemblies(reference, newReference), "Imported reference does not match original.");
        }
コード例 #22
0
        public void TypeWithAssemblyNameWithPublicKey()
        {
            const string ns          = "MyNamespace";
            const string name        = "MyType";
            var          assemblyRef = new AssemblyReference(
                "MyAssembly",
                new Version(1, 2, 3, 4),
                false,
                new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 });

            var expected = new TypeReference(assemblyRef, ns, name).ToTypeSignature();

            var actual = TypeNameParser.Parse(_module,
                                              $"{ns}.{name}, {assemblyRef.FullName}");

            Assert.Equal(expected, actual, _comparer);
        }
コード例 #23
0
        public void can_write_and_read_Aliases()
        {
            var project           = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                Aliases = "some alias"
            };

            project.Add <AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find <AssemblyReference>("Foo")
            .Aliases.ShouldEqual("some alias");
        }
コード例 #24
0
        public void ImportExistingAssembly()
        {
            var assembly = NetAssemblyFactory.CreateAssembly(DummyAssemblyName, true);
            var image    = assembly.NetDirectory.MetadataHeader.LockMetadata();
            var importer = new ReferenceImporter(image);

            const string assemblyName = "some_lib";
            var          version      = new Version(1, 2, 3, 4);

            var reference = new AssemblyReference(assemblyName, version);

            image.Assembly.AssemblyReferences.Add(reference);

            var newReference = importer.ImportAssembly(new AssemblyReference(assemblyName, version));

            Assert.Equal(reference, newReference, _comparer);
        }
コード例 #25
0
        public void can_write_and_read_fusion_name()
        {
            var project           = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                FusionName = "some fusion"
            };

            project.Add <AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find <AssemblyReference>("Foo")
            .FusionName.ShouldEqual("some fusion");
        }
コード例 #26
0
        public void can_write_and_read_Private_null()
        {
            var project           = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                Private = null
            };

            project.Add <AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find <AssemblyReference>("Foo")
            .Private.ShouldBeNull();
        }
コード例 #27
0
        public void can_write_and_read_SpecificVersion_false()
        {
            var project           = CsProjFile.CreateAtLocation("Foo.csproj", "Foo");
            var assemblyReference = new AssemblyReference("Foo")
            {
                SpecificVersion = false
            };

            project.Add <AssemblyReference>(assemblyReference);

            project.Save();

            var project2 = CsProjFile.LoadFrom("Foo.csproj");

            project2.Find <AssemblyReference>("Foo")
            .SpecificVersion.Value.ShouldBeFalse();
        }
        /// <summary>
        /// Saves manifest values into the respective manifest
        /// </summary>
        /// <param name="name">Application deployment name</param>
        /// <param name="version">Version number</param>
        /// <param name="deploymentProvider">Deployment provider URL</param>
        /// <param name="deployManifest">Deployment manifest reference</param>
        /// <param name="appManifest">Application manifest reference</param>
        /// <param name="appFiles">List of files to populate app manifest</param>
        /// <param name="preReqs">List of prerequisites to add</param>
        public static void SaveManifestValues(string name, string version, string deploymentProvider, DeployManifest deployManifest, ApplicationManifest appManifest, IList <ApplicationFile> appFiles, IList <AssemblyReference> preReqs)
        {
            // Populate discrete values
            deployManifest.AssemblyIdentity.Name    = name;
            deployManifest.AssemblyIdentity.Version = version;
            deployManifest.DeploymentUrl            = deploymentProvider;
            appManifest.AssemblyIdentity.Version    = version;

            // Refresh app manifest file lists
            appManifest.AssemblyReferences.Clear();
            appManifest.FileReferences.Clear();

            // Populate prerequisites
            foreach (AssemblyReference assemRef in preReqs)
            {
                appManifest.AssemblyReferences.Add(assemRef);
            }

            // Populate assembly and file references
            foreach (ApplicationFile appFile in appFiles)
            {
                string           appFilePath       = Path.Combine(appFile.RelativePath, appFile.FileName);
                string           appManifestFolder = Path.GetDirectoryName(appManifest.SourcePath);
                string           appFileFullPath   = Path.Combine(appManifestFolder, appFilePath) + ".deploy";
                AssemblyIdentity assemId           = AssemblyIdentity.FromFile(appFileFullPath);
                if (assemId != null)                 // valid assembly
                {
                    AssemblyReference assemRef = appManifest.AssemblyReferences.Add(appFileFullPath);
                    assemRef.TargetPath = appFilePath;
                    if (appFile.EntryPoint)
                    {
                        appManifest.EntryPoint = assemRef;
                    }
                }
                else
                {
                    FileReference fref = appManifest.FileReferences.Add(appFileFullPath);
                    fref.TargetPath = appFilePath;
                    if (appFile.DataFile)
                    {
                        fref.IsDataFile = true;
                    }
                }
            }
        }
コード例 #29
0
        public ManifestMetadataTableNode(NodeFactory nodeFactory)
            : base(nodeFactory.Target)
        {
            _assemblyRefToModuleIdMap  = new Dictionary <string, int>();
            _moduleIdToAssemblyNameMap = new Dictionary <int, AssemblyName>();
            _manifestAssemblyMvids     = new List <Guid>();
            _signatureEmitters         = new List <ISignatureEmitter>();
            _nodeFactory  = nodeFactory;
            _nextModuleId = 1;

            if (!_nodeFactory.CompilationModuleGroup.IsCompositeBuildMode)
            {
                MetadataReader mdReader = _nodeFactory.CompilationModuleGroup.CompilationModuleSet.Single().MetadataReader;
                _assemblyRefCount = mdReader.GetTableRowCount(TableIndex.AssemblyRef) + 1;

                if (!_nodeFactory.CompilationModuleGroup.IsInputBubble)
                {
                    for (int assemblyRefIndex = 1; assemblyRefIndex < _assemblyRefCount; assemblyRefIndex++)
                    {
                        AssemblyReferenceHandle assemblyRefHandle = MetadataTokens.AssemblyReferenceHandle(assemblyRefIndex);
                        AssemblyReference       assemblyRef       = mdReader.GetAssemblyReference(assemblyRefHandle);
                        string assemblyName = mdReader.GetString(assemblyRef.Name);
                        _assemblyRefToModuleIdMap[assemblyName] = assemblyRefIndex;
                    }
                }

                // AssemblyRefCount + 1 corresponds to ROWID 0 in the manifest metadata
                _nextModuleId += _assemblyRefCount;
            }

            if (_nodeFactory.CompilationModuleGroup.IsCompositeBuildMode)
            {
                // Fill in entries for all input modules right away to make sure they have parallel indices
                int nextExpectedId = 1;
                foreach (EcmaModule inputModule in _nodeFactory.CompilationModuleGroup.CompilationModuleSet)
                {
                    int acquiredId = ModuleToIndexInternal(inputModule);
                    if (acquiredId != nextExpectedId)
                    {
                        throw new InternalCompilerErrorException($"Manifest metadata consistency error - acquired ID {acquiredId}, expected {nextExpectedId}");
                    }
                    nextExpectedId++;
                }
            }
        }
コード例 #30
0
        protected virtual void LoadReferences(ProjectElement project, Hashtable projects, XmlDocument doc, string projectDir, string projectLangTag)
        {
            string      lReferencesQuery = String.Format(STR_ReferencesQueryFormat, projectLangTag);
            XmlNodeList lReferences      = doc.SelectNodes(lReferencesQuery);
            int         lCount           = lReferences.Count;

            for (int i = 0; i < lCount; i++)
            {
                System.Xml.XmlNode lReferenceNode = lReferences[i];
                System.Xml.XmlNode lName          = lReferenceNode.Attributes.GetNamedItem(STR_Name);
                System.Xml.XmlNode lAssemblyName  = lReferenceNode.Attributes.GetNamedItem(STR_AssemblyName);
                if (lAssemblyName != null)
                {
                    string lAssemblyNameStr = lAssemblyName.Value;
                    string lPath            = FrameworkHelper.GetAssemblyPath(lAssemblyNameStr);
                    if (lPath == null || lPath.Length == 0)
                    {
                        System.Xml.XmlNode lHintPath = lReferenceNode.Attributes.GetNamedItem("HintPath");
                        lPath = lHintPath.Value;
                        lPath = PathUtilities.GetPath(projectDir, lPath);
                        if (File.Exists(lPath))
                        {
                            AssemblyReference lRef = new AssemblyReference(lPath);
                            project.AddReference(lRef);
                        }
                    }
                    else
                    {
                        project.AddReferenceByName(lAssemblyNameStr);
                    }
                }
                else
                {
                    System.Xml.XmlNode lProjectRef = lReferenceNode.Attributes.GetNamedItem(STR_Project);
                    string             lGuid       = lProjectRef.Value;
                    ProjectInfo        lInfo       = projects[lGuid] as ProjectInfo;
                    if (lInfo != null)
                    {
                        AssemblyReference lRef = new AssemblyReference(String.Empty);
                        lRef.SetSourceProjectFullName(lInfo.FilePath);
                        project.AddReference(lRef);
                    }
                }
            }
        }
コード例 #31
0
        private MetadataReference GetReference()
        {
            if (File.Exists(assemblyPath) == false)
            {
                if (assemblyImage != null && assemblyImage.Length > 0)
                {
                    // Create refererence from image
                    return(AssemblyReference.FromImage(assemblyImage).Reference);
                }
            }
            else
            {
                // Create reference from path
                return(AssemblyReference.FromNameOrFile(assemblyPath).Reference);
            }

            throw new Exception("Assembly reference asset is invalid!");
        }
コード例 #32
0
 public static void Build(CustomAttribute customAttribute)
 {
     customAttribute.Constructor =
         new MethodReference(
             ".ctor",
             new TypeReference(
                 "SerializableAttribute",
                 "System",
                 AssemblyReference.GetMscorlib(customAttribute.Assembly)),
             new CallSite(
                 true,
                 false,
                 MethodCallingConvention.Default,
                 TypeReference.GetPrimitiveType(PrimitiveTypeCode.Void, customAttribute.Assembly),
                 ReadOnlyList <TypeSignature> .Empty,
                 0,
                 0));
 }
コード例 #33
0
ファイル: AssemblyResolver.cs プロジェクト: Tyler-Zhou/SHFB
        /// <summary>
        /// This is called if assembly reference resolution fails after probing
        /// </summary>
        /// <param name="reference">The assembly reference</param>
        /// <param name="module">The module</param>
        /// <returns>Always returns null</returns>
        private AssemblyNode UnresolvedReference(AssemblyReference reference, Module module)
        {
            // Don't raise the event if ignored.  Also, a bit of a hack for now.  If it's a "System." or a
            // "Microsoft." assembly, just ignore it.  There are some issues resolving some of the .NETCore
            // and .NETStandard assemblies due to variations in how they are distributed.
            if (!ignoreIfUnresolved.Contains(reference.Name) && !reference.Name.StartsWith("System.",
                                                                                           StringComparison.Ordinal) && !reference.Name.StartsWith("Microsoft.", StringComparison.Ordinal))
            {
                OnUnresolvedAssemblyReference(reference, module);
            }
            else
            {
                this.MessageLogger(LogLevel.Warn,
                                   $"Ignoring unresolved assembly reference: {reference.Name} ({reference.StrongName}) required by {module.Name}");
            }

            return(null);
        }
コード例 #34
0
        public override void Build(CustomAttribute customAttribute)
        {
            customAttribute.Constructor =
                new MethodReference(
                    ".ctor",
                    new TypeReference(
                        "ObfuscateAssemblyAttribute",
                        "System.Reflection",
                        AssemblyReference.GetMscorlib(customAttribute.Assembly)),
                    new CallSite(
                        true,
                        false,
                        MethodCallingConvention.Default,
                        TypeReference.GetPrimitiveType(PrimitiveTypeCode.Void, customAttribute.Assembly),
                        new TypeSignature[]
            {
                TypeReference.GetPrimitiveType(PrimitiveTypeCode.Boolean, customAttribute.Assembly),
            },
                        0,
                        0));

            // Ctor arguments
            var ctorArguments = customAttribute.CtorArguments;

            ctorArguments.Clear();
            ctorArguments.Add(
                new CustomAttributeTypedArgument(
                    _assemblyIsPrivate,
                    TypeReference.GetPrimitiveType(PrimitiveTypeCode.Boolean, customAttribute.Assembly)));

            // Named arguments
            var namedArguments = customAttribute.NamedArguments;

            namedArguments.Clear();

            // StripAfterObfuscation
            namedArguments.Add(
                new CustomAttributeNamedArgument(
                    "StripAfterObfuscation",
                    CustomAttributeNamedArgumentType.Property,
                    new CustomAttributeTypedArgument(
                        _stripAfterObfuscation,
                        TypeReference.GetPrimitiveType(PrimitiveTypeCode.Boolean, customAttribute.Assembly))));
        }
コード例 #35
0
        /// <summary>
        /// Given a path to an assembly, identifies files in the same directory
        /// that could satisfy the assembly's dependencies. May throw.
        /// </summary>
        /// <remarks>
        /// Dependencies are identified by simply checking the name of an assembly
        /// reference against a file name; if they match the file is considered a
        /// dependency. Other factors, such as version, culture, public key, etc.,
        /// are not considered, and so the returned collection may include items that
        /// cannot in fact satisfy the original assembly's dependencies.
        /// </remarks>
        /// <exception cref="IOException">If the file at <paramref name="filePath"/> does not exist or cannot be accessed.</exception>
        /// <exception cref="BadImageFormatException">If the file is not an assembly or is somehow corrupted.</exception>
        public static ImmutableArray <string> FindAssemblySet(string filePath)
        {
            Debug.Assert(filePath != null);
            Debug.Assert(PathUtilities.IsAbsolute(filePath));

            Queue <string>   workList    = new Queue <string>();
            HashSet <string> assemblySet = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            workList.Enqueue(filePath);

            while (workList.Count > 0)
            {
                string assemblyPath = workList.Dequeue();

                if (!assemblySet.Add(assemblyPath))
                {
                    continue;
                }

                string directory = Path.GetDirectoryName(assemblyPath);

                using (PEReader reader = new PEReader(FileUtilities.OpenRead(assemblyPath)))
                {
                    MetadataReader metadataReader = reader.GetMetadataReader();
                    AssemblyReferenceHandleCollection assemblyReferenceHandles = metadataReader.AssemblyReferences;

                    foreach (AssemblyReferenceHandle handle in assemblyReferenceHandles)
                    {
                        AssemblyReference reference     = metadataReader.GetAssemblyReference(handle);
                        string            referenceName = metadataReader.GetString(reference.Name);

                        string referencePath = Path.Combine(directory, referenceName + ".dll");

                        if (!assemblySet.Contains(referencePath) &&
                            File.Exists(referencePath))
                        {
                            workList.Enqueue(referencePath);
                        }
                    }
                }
            }

            return(ImmutableArray.CreateRange(assemblySet));
        }
コード例 #36
0
            private void VisitReference(AssemblyReference reference, Dictionary <string, AssemblyReference> referenceMap, List <AssemblyReference> referenceList)
            {
                if (reference.Visited)
                {
                    return;
                }

                reference.Visit();
                foreach (string dependencyName in reference.Dependencies)
                {
                    AssemblyReference dependencyReference;
                    if (referenceMap.TryGetValue(dependencyName, out dependencyReference))
                    {
                        VisitReference(dependencyReference, referenceMap, referenceList);
                    }
                }

                referenceList.Add(reference);
            }
コード例 #37
0
        private static AssemblyReference FormatAssemblyReference(XElement reference)
        {
            var output = new AssemblyReference
            {
                Include = reference.Attribute("Include")?.Value
            };

            if (output.Include.Equals("Microsoft.CSharp", StringComparison.OrdinalIgnoreCase))
            {
                // This reference is obsolete.
                return(null);
            }

            var specificVersion = reference.Descendants().FirstOrDefault(x => x.Name.LocalName == "SpecificVersion");

            if (specificVersion != null)
            {
                output.SpecificVersion = specificVersion.Value;
            }

            var hintPath = reference.Descendants().FirstOrDefault(x => x.Name.LocalName == "HintPath");

            if (hintPath != null)
            {
                output.HintPath = hintPath.Value;
            }

            var isPrivate = reference.Descendants().FirstOrDefault(x => x.Name.LocalName == "Private");

            if (isPrivate != null)
            {
                output.Private = isPrivate.Value;
            }

            var embedInteropTypes = reference.Descendants().FirstOrDefault(x => x.Name.LocalName == "EmbedInteropTypes");

            if (embedInteropTypes != null)
            {
                output.EmbedInteropTypes = embedInteropTypes.Value;
            }

            return(output);
        }
コード例 #38
0
        private uint AddImplementation(IImplementation implementation)
        {
            if (implementation is null)
            {
                return(0);
            }

            var token = implementation switch
            {
                AssemblyReference assemblyReference => GetAssemblyReferenceToken(assemblyReference),
                ExportedType exportedType => AddExportedType(exportedType),
                FileReference fileReference => AddFileReference(fileReference),
                _ => throw new ArgumentOutOfRangeException(nameof(implementation))
            };

            return(Metadata.TablesStream
                   .GetIndexEncoder(CodedIndex.Implementation)
                   .EncodeToken(token));
        }
コード例 #39
0
        public GenericInstantiationTest()
        {
            _image = NetAssemblyFactory.CreateAssembly("SomeAssembly", true)
                     .NetDirectory.MetadataHeader.LockMetadata();
            _importer = new ReferenceImporter(_image);

            var scope = new AssemblyReference("SomeAssemblyRef", new Version(1, 2, 3, 4));

            _typeArgs = new TypeSignature[] { _image.TypeSystem.String, _image.TypeSystem.Int32, _image.TypeSystem.Double };

            _methodArgs = new TypeSignature[] { _image.TypeSystem.Byte, _image.TypeSystem.SByte, _image.TypeSystem.Object };

            _context = new GenericContext(
                new GenericInstanceTypeSignature(
                    new TypeReference(scope, "A.B.C", "M"),
                    _typeArgs),
                new GenericInstanceMethodSignature(
                    _methodArgs));
        }
コード例 #40
0
 protected virtual void LoadReferences(ProjectElement project, Hashtable projects, XmlDocument doc, string projectDir, string projectLangTag)
 {
     string lReferencesQuery = String.Format(STR_ReferencesQueryFormat, projectLangTag);
     XmlNodeList lReferences = doc.SelectNodes(lReferencesQuery);
     int lCount = lReferences.Count;
     for (int i = 0; i < lCount; i++)
     {
         System.Xml.XmlNode lReferenceNode = lReferences[i];
         System.Xml.XmlNode lName = lReferenceNode.Attributes.GetNamedItem(STR_Name);
         System.Xml.XmlNode lAssemblyName = lReferenceNode.Attributes.GetNamedItem(STR_AssemblyName);
         if (lAssemblyName != null)
         {
             string lAssemblyNameStr = lAssemblyName.Value;
             string lPath = FrameworkHelper.GetAssemblyPath(lAssemblyNameStr);
             if (lPath == null || lPath.Length == 0)
             {
                 System.Xml.XmlNode lHintPath = lReferenceNode.Attributes.GetNamedItem("HintPath");
                 lPath = lHintPath.Value;
                 lPath = PathUtilities.GetPath(projectDir, lPath);
                 if (File.Exists(lPath))
                 {
                     AssemblyReference lRef = new AssemblyReference(lPath);
                     project.AddReference(lRef);
                 }
             }
             else
                 project.AddReferenceByName(lAssemblyNameStr);
         }
         else
         {
             System.Xml.XmlNode lProjectRef = lReferenceNode.Attributes.GetNamedItem(STR_Project);
             string lGuid = lProjectRef.Value;
             ProjectInfo lInfo = projects[lGuid] as ProjectInfo;
             if (lInfo != null)
             {
                 AssemblyReference lRef = new AssemblyReference(String.Empty);
                 lRef.SetSourceProjectFullName(lInfo.FilePath);
                 project.AddReference(lRef);
             }
         }
     }
 }
コード例 #41
0
 private AssemblyReference ReadAssemblyReferenceItem(ProjectItemElement element)
 {
     var reference = new AssemblyReference(element.Include);
     if (element.HasMetadata)
     {
         foreach (var metadata in element.Metadata)
         {
             switch (metadata.Name)
             {
                 case "SpecificVersion":
                     reference.SpecificVersion = bool.Parse(metadata.Value);
                     break;
                 case "HintPath":
                     reference.HintPath = metadata.Value;
                     break;
                 default:
                     throw new FormatException(string.Format("Invalid or unsupported metadata '{0}'.", metadata.Name));
             }
         }
     }
     return reference;
 }
コード例 #42
0
ファイル: TypeSystem.cs プロジェクト: JerreS/AsmResolver
        public TypeSystem(MetadataHeader header, bool isMsCorLib)
        {
            _header = header;
            _isMsCorLib = isMsCorLib;

            if (!isMsCorLib)
            {
                MsCorLibReference = header.GetStream<TableStream>().GetTable<AssemblyReference>().FirstOrDefault(x => x.Name == "mscorlib");
                if (MsCorLibReference == null)
                {
                    MsCorLibReference = new AssemblyReference(new ReflectionAssemblyNameWrapper(typeof(object).Assembly.GetName()))
                    {
                        Header = header,
                        Culture = "neutral",
                        Version = new Version(header.VersionString[1] - 48, 0, 0, 0)
                    };
                }
            }

            Boolean = CreateSignature(ElementType.Boolean, "Boolean", true);
            SByte = CreateSignature(ElementType.I1, "SByte", true);
            Int16 = CreateSignature(ElementType.I2, "Int16", true);
            Int32 = CreateSignature(ElementType.I4, "Int32", true);
            Int64 = CreateSignature(ElementType.I8, "Int64", true);
            IntPtr = CreateSignature(ElementType.I, "IntPtr", true);
            Byte = CreateSignature(ElementType.U1, "Byte", true);
            UInt16 = CreateSignature(ElementType.U2, "UInt16", true);
            UInt32 = CreateSignature(ElementType.U4, "UInt32", true);
            UInt64 = CreateSignature(ElementType.U8, "UInt64", true);
            UIntPtr = CreateSignature(ElementType.U, "UIntPtr", true);
            Single = CreateSignature(ElementType.R4, "Single", true);
            Double = CreateSignature(ElementType.R8, "Double", true);
            Object = CreateSignature(ElementType.Object, "Object", false);
            Char = CreateSignature(ElementType.Char, "Char", true);
            String = CreateSignature(ElementType.String, "String", false);
            Type = CreateSignature(ElementType.Type, "Type", false);
            TypedReference = CreateSignature(ElementType.TypedByRef, "TypedReference", true);
            Void = CreateSignature(ElementType.Void, "Void", true);
        }
コード例 #43
0
ファイル: SimpleSignerMain.cs プロジェクト: virmitio/devtools
        private int Startup(IEnumerable<string> args)
        {
            var options = args.Where(each => each.StartsWith("--")).Switches();
            var parameters = args.Parameters();

            foreach (var arg in options.Keys) {
                var argumentParameters = options[arg];

                switch (arg) {
                        /* global switches */
                    case "load-config":
                        // all ready done, but don't get too picky.
                        break;

                    case "nologo":
                        this.Assembly().SetLogo(string.Empty);
                        break;

                    case "help":
                        return Help();

                    case "certificate-path":
                        var cert = argumentParameters.Last();
                        _signingCertPath = _signingCertPath.IndexOf(":") > 1 ? cert : Path.GetFullPath(argumentParameters.Last());
                        break;

                    case "password":
                        _signingCertPassword = argumentParameters.Last();
                        break;

                    case "remember":
                        _remember = true;
                        break;

                    case "auto":
                        break;

                    case "sign":
                        _sign = true;
                        break;

                    case "just-sign":
                        _sign = true;
                        _justsign = true;
                        break;

                    case "strong-name":
                        _strongname = true;
                        break;

                    case "verbose":
                        _verbose = true;
                        break;

                    case "company":
                        _company = argumentParameters.Last();
                        break;

                    case "description":
                        _description = argumentParameters.Last();
                        break;

                    case "internal-name":
                        _internalName = argumentParameters.Last();
                        break;

                    case "copyright":
                        _copyright = argumentParameters.Last();
                        break;

                    case "original-filename":
                        _originalFilename = argumentParameters.Last();
                        break;

                    case "product-name":
                        _productName = argumentParameters.Last();
                        break;

                    case "verify":
                        _verify = true;
                        break;

                    case "reference-assembly":
                        foreach (var asmRef in argumentParameters) {
                            if (string.IsNullOrEmpty(asmRef)) {
                                return Fail("Missing assembly information for --assembly-reference.");
                            }

                            var parts = asmRef.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                            var assemblyref = new AssemblyReference {Name = parts[0]};

                            foreach (var part in parts.Skip(1)) {
                                var kp = part.Split("= ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                                if (kp.Length != 2) {
                                    return Fail("Invalid option '{0}' in assembly reference '{1}'.", part, asmRef);
                                }

                                switch (kp[0].ToLower()) {
                                    case "version":
                                    case "ver":
                                        assemblyref.Version = kp[1];
                                        if (assemblyref.Version == 0L) {
                                            return Fail("Invalid Version '{0}' in assembly reference '{1}'.", kp[1], asmRef);
                                        }
                                        break;

                                    case "publickeytoken":
                                    case "pkt":
                                    case "token":
                                        if (kp[1].Length != 16) {
                                            return Fail("Invalid publicKeyToken '{0}' in assembly reference '{1}'.", kp[1], asmRef);
                                        }
                                        assemblyref.PublicKeyToken = kp[1];
                                        break;

                                    case "processorarchitecture":
                                    case "architecture":
                                    case "arch":
                                        assemblyref.Architecture = kp[1];
                                        if (assemblyref.Architecture == Architecture.Auto || assemblyref.Architecture == Architecture.Unknown) {
                                            return Fail("Invalid processorArchitecture '{0}' in assembly reference '{1}'.", kp[1], asmRef);
                                        }
                                        break;
                                }
                            }
                            if (assemblyref.Version == 0 || assemblyref.Architecture == Architecture.Unknown || string.IsNullOrEmpty(assemblyref.PublicKeyToken)) {
                                return Fail("Invalid assembly reference '{0}' ", asmRef);
                            }
                            assemblyReferences.Add(assemblyref);
                        }
                        break;

                    case "product-version":
                        _productVersion = argumentParameters.Last();
                        if (_productVersion == 0L) {
                            return Fail("--product-version must be in the form ##.##.##.##");
                        }

                        break;

                    case "file-version":
                        _fileVersion = argumentParameters.Last();
                        if (_fileVersion == 0L) {
                            return Fail("--file-version must be in the form ##.##.##.##");
                        }
                        break;

                    case "execution-level":
                        switch (argumentParameters.Last()) {
                            case "administrator":
                            case "admin":
                            case "requires-admin":
                            case "requiresadmin":
                            case "requiresadministrator":
                            case "requires-administrator":
                                _executionLevel = ExecutionLevel.requireAdministrator;
                                break;
                            case "invoker":
                            case "asinvoker":
                            case "as-invoker":
                                _executionLevel = ExecutionLevel.asInvoker;
                                break;
                            case "highest-available":
                            case "highest":
                            case "highestavailable":
                                _executionLevel = ExecutionLevel.highestAvailable;
                                break;
                        }
                        break;

                    case "dpi-aware":
                        if (argumentParameters.Last().IsTrue()) {
                            _dpiAware = true;
                        }
                        if (argumentParameters.Last().IsFalse()) {
                            _dpiAware = false;
                        }
                        break;
                    default:
                        return Fail("Unknown parameter [--{0}]", arg);
                }
            }

            Logo();

            if (_verify) {
                // return Verify(parameters);
            }

            if (string.IsNullOrEmpty(_signingCertPath)) {
                _certificate = CertificateReference.Default;
                if (_certificate == null) {
                    return Fail("No default certificate stored in the registry");
                }
            } else if (string.IsNullOrEmpty(_signingCertPassword)) {
                _certificate = new CertificateReference(_signingCertPath);
            } else {
                _certificate = new CertificateReference(_signingCertPath, _signingCertPassword);
            }

            using (new ConsoleColors(ConsoleColor.White, ConsoleColor.Black)) {
                Verbose("Loaded certificate with private key {0}", _certificate.Location);
            }

            if (_remember) {
                Verbose("Storing certificate details in the registry.");
                _certificate.RememberPassword();
                CertificateReference.Default = _certificate;
            }

            if (parameters.Count() < 1) {
                return Fail("Missing files to sign/name. \r\n\r\n    Use --help for command line help.");
            }

            var tasks = new List<Task>();

            if (_company != null && _company.Equals("auto", StringComparison.CurrentCultureIgnoreCase)) {
                _company = _certificate.CommonName;
            }
            var failures = 0;
            try {
                var allFiles = parameters.FindFilesSmarter().ToArray();
                var origMD5 = new XDictionary<string, string>();

                var loading = allFiles.Select(each =>
                    Binary.Load(each,
                        BinaryLoadOptions.PEInfo |
                            BinaryLoadOptions.VersionInfo |
                                BinaryLoadOptions.Managed |
                                    BinaryLoadOptions.Resources |
                                        BinaryLoadOptions.Manifest |
                                            BinaryLoadOptions.UnsignedManagedDependencies |
                                                BinaryLoadOptions.MD5).ContinueWith(antecedent => {
                                                    lock (allFiles) {
                                                        if (antecedent.IsFaulted) {
                                                            Console.WriteLine("Failed to load file '{0}'", each);
                                                            var e = antecedent.Exception.Flatten().InnerExceptions.First();
                                                            Console.WriteLine("{0}--{1}", e.Message, e.StackTrace);
                                                            return;
                                                        }

                                                        try {
                                                            var binary = antecedent.Result;
                                                            origMD5.Add(each, binary.MD5);

                                                            if (binary.IsPEFile && !_justsign) {
                                                                // do PE file stuff
                                                                if (_sign) {
                                                                    binary.SigningCertificate = _certificate;
                                                                }

                                                                if (binary.IsManaged && _strongname) {
                                                                    binary.StrongNameKeyCertificate = _certificate;
                                                                }

                                                                if (!assemblyReferences.IsNullOrEmpty()) {
                                                                    foreach (var asmRef in assemblyReferences) {
                                                                        binary.Manifest.Value.AddDependency(asmRef.Name, asmRef.Version, asmRef.Architecture, asmRef.PublicKeyToken);
                                                                    }
                                                                }

                                                                if (_company != null) {
                                                                    binary.CompanyName = _company;
                                                                }
                                                                if (_description != null) {
                                                                    binary.FileDescription = _description;
                                                                }
                                                                if (_internalName != null) {
                                                                    binary.InternalName = _internalName;
                                                                }
                                                                if (_copyright != null) {
                                                                    binary.LegalCopyright = _copyright;
                                                                }
                                                                if (_originalFilename != null) {
                                                                    binary.OriginalFilename = _originalFilename;
                                                                }
                                                                if (_productName != null) {
                                                                    binary.ProductName = _productName;
                                                                }
                                                                if (_productVersion != 0) {
                                                                    binary.ProductVersion = _productVersion;
                                                                }
                                                                if (_fileVersion != 0) {
                                                                    binary.FileVersion = _fileVersion;
                                                                }
                                                                if (_dpiAware != null) {
                                                                    binary.Manifest.Value.DpiAware = _dpiAware == true;
                                                                }
                                                                if (_executionLevel != ExecutionLevel.none) {
                                                                    binary.Manifest.Value.RequestedExecutionLevel = _executionLevel;
                                                                }
                                                            } else {
                                                                // do stuff for non-pe files
                                                                // we can try to apply a signature, and that's about it.
                                                                if (_sign) {
                                                                    binary.SigningCertificate = _certificate;
                                                                }
                                                            }
                                                            binary.Save().Wait();
                                                        } catch (Exception e) {
                                                            while (e.GetType() == typeof (AggregateException)) {
                                                                e = (e as AggregateException).Flatten().InnerExceptions[0];
                                                            }
                                                            failures += Fail("{0}--{1}", e.Message, e.StackTrace);
                                                        }
                                                    }
                                                }, TaskContinuationOptions.AttachedToParent)).ToArray();

                // Thread.Sleep(1000);
                // wait for loading.
                return Task.Factory.ContinueWhenAll(loading, tsks => {
                    Console.WriteLine("Done {0} files", tsks.Length);

                    (from each in Binary.Files
                        select new {
                            Filename = Path.GetFileName(each.Filename),
                            Original_MD5 = origMD5[each.Filename],
                            New_MD5 = each.MD5,
                            //  Status = each.Message,
                        }).ToTable().ConsoleOut();

                    if (failures > 0) {
                        Console.WriteLine("*** Bad News. Failed. *** ");
                    }

                    if (Binary.IsAnythingStillLoading) {
                        Console.WriteLine("\r\n==== Uh, stuff is still in the loading state?! ====\r\n");
                    }

                    return failures;
                }).Result;
            } catch (Exception e) {
                Console.WriteLine("{0}--{1}", e.Message, e.StackTrace);
                return Fail("not good.");
            }
        }
コード例 #44
0
 private bool IsDependencyCircular(KeyValuePair<Tuple<SemanticVersion, string>, DllReference> mainAssembly, AssemblyReference dependency)
 {
     foreach (var circularDef in _configurationService.Get().CircularMapping)
     {
         if (circularDef.Item1.Equals(mainAssembly.Value.Id.Item2) &&
             circularDef.Item2.Item1.Equals(dependency.Item2))
         {
             Trace.TraceWarning($"Circular dependency detected between {mainAssembly.Key.Item2} and {dependency.Item2}");
             return true;
         }
             
      }
     return false;
 }
コード例 #45
0
ファイル: CoreTypes.cs プロジェクト: Biegal/Afterthought
    //  Caller should lock peFileToObjectModel
    internal CoreTypes(PEFileToObjectModel peFileToObjectModel) {
      INameTable nameTable = peFileToObjectModel.NameTable;
      PEFileReader peFileReader = peFileToObjectModel.PEFileReader;
      PeReader peReader = peFileToObjectModel.ModuleReader;
      Module module = peFileToObjectModel.Module;
      AssemblyIdentity/*?*/ assemblyIdentity = module.ModuleIdentity as AssemblyIdentity;

      //This does more than just initialize the five types exposed above, since it is also
      //necessary to initialize any typedefs and typerefs to types with short forms
      //in such a way that they have the correct type codes.

      int systemName = nameTable.System.UniqueKey;
      int voidName = nameTable.Void.UniqueKey;
      int booleanName = nameTable.Boolean.UniqueKey;
      int charName = nameTable.Char.UniqueKey;
      int byteName = nameTable.Byte.UniqueKey;
      int sByteName = nameTable.SByte.UniqueKey;
      int int16Name = nameTable.Int16.UniqueKey;
      int uint16Name = nameTable.UInt16.UniqueKey;
      int int32Name = nameTable.Int32.UniqueKey;
      int uint32Name = nameTable.UInt32.UniqueKey;
      int int64Name = nameTable.Int64.UniqueKey;
      int uint64Name = nameTable.UInt64.UniqueKey;
      int stringName = nameTable.String.UniqueKey;
      int intPtrName = nameTable.IntPtr.UniqueKey;
      int uintPtrName = nameTable.UIntPtr.UniqueKey;
      int objectName = nameTable.Object.UniqueKey;
      int singleName = nameTable.Single.UniqueKey;
      int doubleName = nameTable.Double.UniqueKey;
      int decimalName = nameTable.Decimal.UniqueKey;
      int typedReference = nameTable.TypedReference.UniqueKey;
      int enumName = nameTable.Enum.UniqueKey;
      int valueTypeName = nameTable.ValueType.UniqueKey;
      int multicastDelegateName = nameTable.MulticastDelegate.UniqueKey;
      int typeName = nameTable.Type.UniqueKey;
      int arrayName = nameTable.Array.UniqueKey;
      int paramArrayAttributeName = peReader.ParamArrayAttribute.UniqueKey;
      if (assemblyIdentity != null && assemblyIdentity.Equals(peReader.metadataReaderHost.CoreAssemblySymbolicIdentity)) {
        peReader.RegisterCoreAssembly(module as Assembly);
        uint numberOfTypeDefs = peFileReader.TypeDefTable.NumberOfRows;
        for (uint i = 1; i <= numberOfTypeDefs; ++i) {
          TypeDefRow typeDefRow = peFileReader.TypeDefTable[i];
          if (!typeDefRow.IsNested) {
            int namespaceName = peFileToObjectModel.GetNameFromOffset(typeDefRow.Namespace).UniqueKey;
            if (namespaceName == systemName) {
              int typeDefName = peFileToObjectModel.GetNameFromOffset(typeDefRow.Name).UniqueKey;
              if (typeDefName == voidName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Void);
              else if (typeDefName == booleanName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Boolean);
              else if (typeDefName == charName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Char);
              else if (typeDefName == byteName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Byte);
              else if (typeDefName == sByteName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.SByte);
              else if (typeDefName == int16Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Int16);
              else if (typeDefName == uint16Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt16);
              else if (typeDefName == int32Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Int32);
              else if (typeDefName == uint32Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt32);
              else if (typeDefName == int64Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Int64);
              else if (typeDefName == uint64Name)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt64);
              else if (typeDefName == stringName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.String);
              else if (typeDefName == intPtrName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.IntPtr);
              else if (typeDefName == uintPtrName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.UIntPtr);
              else if (typeDefName == objectName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Object);
              else if (typeDefName == singleName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Single);
              else if (typeDefName == doubleName)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.Double);
              else if (typeDefName == typedReference)
                peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.TypedReference);
              else if (typeDefName == enumName)
                this.SystemEnum = peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
              else if (typeDefName == valueTypeName)
                this.SystemValueType = peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
              else if (typeDefName == multicastDelegateName)
                this.SystemMulticastDelegate = peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
              else if (typeDefName == typeName)
                this.SystemType = peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
              else if (typeDefName == paramArrayAttributeName)
                this.SystemParamArrayAttribute = peFileToObjectModel.GetPredefinedTypeDefinitionAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
            }
          }
        }
      } else {
        uint numberOfTypeRefs = peFileReader.TypeRefTable.NumberOfRows;
        AssemblyReference/*?*/ coreAssemblyRef = peFileToObjectModel.FindAssemblyReference(peFileToObjectModel.CoreAssemblySymbolicIdentity);
        if (coreAssemblyRef == null) {
          //  Error...
          coreAssemblyRef = new AssemblyReference(peFileToObjectModel, 1, peFileToObjectModel.CoreAssemblySymbolicIdentity, AssemblyFlags.Retargetable);
        }
        uint coreAssemblyRefToken = coreAssemblyRef.TokenValue;
        for (uint i = 1; i <= numberOfTypeRefs; ++i) {
          TypeRefRow typeRefRow = peFileReader.TypeRefTable[i];
          if (typeRefRow.ResolutionScope != coreAssemblyRefToken)
            continue;
          int namespaceName = peFileToObjectModel.GetNameFromOffset(typeRefRow.Namespace).UniqueKey;
          if (namespaceName == systemName) {
            int typeDefName = peFileToObjectModel.GetNameFromOffset(typeRefRow.Name).UniqueKey;
            if (typeDefName == voidName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Void);
            else if (typeDefName == booleanName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Boolean);
            else if (typeDefName == charName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Char);
            else if (typeDefName == byteName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Byte);
            else if (typeDefName == sByteName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.SByte);
            else if (typeDefName == int16Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Int16);
            else if (typeDefName == uint16Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt16);
            else if (typeDefName == int32Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Int32);
            else if (typeDefName == uint32Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt32);
            else if (typeDefName == int64Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Int64);
            else if (typeDefName == uint64Name)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.UInt64);
            else if (typeDefName == stringName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.String);
            else if (typeDefName == intPtrName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.IntPtr);
            else if (typeDefName == uintPtrName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.UIntPtr);
            else if (typeDefName == objectName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Object);
            else if (typeDefName == singleName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Single);
            else if (typeDefName == doubleName)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.Double);
            else if (typeDefName == typedReference)
              peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.TypedReference);
            else if (typeDefName == enumName)
              this.SystemEnum = peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
            else if (typeDefName == valueTypeName)
              this.SystemValueType = peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
            else if (typeDefName == multicastDelegateName)
              this.SystemMulticastDelegate = peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
            else if (typeDefName == typeName)
              this.SystemType = peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
            else if (typeDefName == paramArrayAttributeName)
              this.SystemParamArrayAttribute = peFileToObjectModel.GetPredefinedTypeRefReferenceAtRowWorker(i, MetadataReaderSignatureTypeCode.NotModulePrimitive);
          }
        }
        NamespaceReference systemNSR = peFileToObjectModel.GetNamespaceReferenceForString(coreAssemblyRef, nameTable.System);
        if (this.SystemEnum == null || (peFileToObjectModel.SystemEnumAssembly != null && coreAssemblyRef != peFileToObjectModel.SystemEnumAssembly))
          this.SystemEnum = peFileToObjectModel.typeCache.CreateCoreTypeReference(peFileToObjectModel.SystemEnumAssembly??coreAssemblyRef, systemNSR, nameTable.Enum, MetadataReaderSignatureTypeCode.NotModulePrimitive);
        if (this.SystemValueType == null || (peFileToObjectModel.SystemValueTypeAssembly != null && coreAssemblyRef != peFileToObjectModel.SystemValueTypeAssembly))
          this.SystemValueType = peFileToObjectModel.typeCache.CreateCoreTypeReference(peFileToObjectModel.SystemValueTypeAssembly??coreAssemblyRef, systemNSR, nameTable.ValueType, MetadataReaderSignatureTypeCode.NotModulePrimitive);
        if (this.SystemMulticastDelegate == null || (peFileToObjectModel.SystemMulticastDelegateAssembly != null && coreAssemblyRef != peFileToObjectModel.SystemMulticastDelegateAssembly))
          this.SystemMulticastDelegate = peFileToObjectModel.typeCache.CreateCoreTypeReference(peFileToObjectModel.SystemMulticastDelegateAssembly??coreAssemblyRef, systemNSR, nameTable.MulticastDelegate, MetadataReaderSignatureTypeCode.NotModulePrimitive);
        if (this.SystemType == null || (peFileToObjectModel.SystemTypeAssembly != null && coreAssemblyRef != peFileToObjectModel.SystemTypeAssembly))
          this.SystemType = peFileToObjectModel.typeCache.CreateCoreTypeReference(peFileToObjectModel.SystemTypeAssembly??coreAssemblyRef, systemNSR, nameTable.Type, MetadataReaderSignatureTypeCode.NotModulePrimitive);
        if (this.SystemParamArrayAttribute == null || (peFileToObjectModel.SystemParamArrayAttributeAssembly != null && coreAssemblyRef != peFileToObjectModel.SystemParamArrayAttributeAssembly))
          this.SystemParamArrayAttribute = peFileToObjectModel.typeCache.CreateCoreTypeReference(peFileToObjectModel.SystemParamArrayAttributeAssembly??coreAssemblyRef, systemNSR, peReader.ParamArrayAttribute, MetadataReaderSignatureTypeCode.NotModulePrimitive);
      }
    }
コード例 #46
0
            public List<string> GetAssemblyPaths()
            {
                // Perform a topological sort to get the list of assemblies in order
                // to cause loading of dependencies to happen before an assembly
                // that references them.

                List<AssemblyReference> references = new List<AssemblyReference>();
                Dictionary<string, AssemblyReference> referenceMap =
                    new Dictionary<string, AssemblyReference>(StringComparer.Ordinal);

                foreach (KeyValuePair<string, AssemblyDefinition> assembly in _assemblies) {
                    AssemblyReference reference = new AssemblyReference(assembly.Key, assembly.Value);
                    references.Add(reference);
                    referenceMap[reference.FullName] = reference;
                }

                List<AssemblyReference> sortedReferences = new List<AssemblyReference>();
                references.ForEach(r => VisitReference(r, referenceMap, sortedReferences));

                return sortedReferences.Select(r => r.Path).ToList();
            }
コード例 #47
0
		private void SerializeAssemblyReference(AssemblyReference def)
		{
			if (def == null) return;

			XmlAttribute att = Document.CreateAttribute("assembly");
			att.Value = def.AssemblyName;
			Current.Attributes.Append( att );
		}
コード例 #48
0
ファイル: StandardVisitor.cs プロジェクト: dbremner/specsharp
 public virtual AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference){
   return assemblyReference;
 }
コード例 #49
0
 public override AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference)
 {
   throw new ApplicationException("unimplemented");
 }
コード例 #50
0
        private IAssemblyReference ParseAssemblyReference(string value, IAssemblyManager assemblyManager)
        {
            string[] assemblyNameParts = this.assembly.Split(new char[] { ':' });

            IAssembly assembly = new Assembly();
            assembly.AssemblyManager = assemblyManager;

            IModule module = new Module();
            module.Assembly = assembly;

            IAssemblyReference assemblyReference = new AssemblyReference();
            assemblyReference.Context = module;
            assemblyReference.Name = assemblyNameParts[0];
            assemblyReference.Version = ((assemblyNameParts.Length > 1) && (assemblyNameParts[1].Length > 0)) ? new Version(assemblyNameParts[1]) : new Version(0, 0, 0, 0);
            assemblyReference.PublicKeyToken = ((assemblyNameParts.Length > 2) && (assemblyNameParts[2].Length > 0)) ? ParseByteArray(assemblyNameParts[2]) : new byte[0];
            assemblyReference.Culture = ((assemblyNameParts.Length > 3) && (assemblyNameParts[3].Length > 0)) ? assemblyNameParts[3] : string.Empty;

            return assemblyReference;
        }
コード例 #51
0
        internal Microsoft.Cci.IAssemblyReference Translate(AssemblySymbol assembly)
        {
            if (ReferenceEquals(sourceModule.ContainingAssembly, assembly))
            {
                return (Microsoft.Cci.IAssemblyReference)this;
            }

            object reference;

            if (SymbolsMap.TryGetValue(assembly, out reference))
            {
                return (Microsoft.Cci.IAssemblyReference)reference;
            }

            AssemblyReference asmRef = new AssemblyReference(assembly);

            SymbolsMap.Add(assembly, asmRef);
            SymbolsMap.Add(assembly.Modules[0], asmRef);

            return asmRef;
        }
コード例 #52
0
        internal Microsoft.Cci.IModuleReference Translate(ModuleSymbol module)
        {
            if (ReferenceEquals(sourceModule, module))
            {
                return this;
            }

            object reference;

            if (SymbolsMap.TryGetValue(module, out reference))
            {
                return (Microsoft.Cci.IModuleReference)reference;
            }

            Microsoft.Cci.IModuleReference moduleRef;
            AssemblySymbol container = module.ContainingAssembly;

            if (container != null && ReferenceEquals(container.Modules[0], module))
            {
                moduleRef = new AssemblyReference(container);
                SymbolsMap.Add(container, moduleRef);
            }
            else
            {
                moduleRef = new ModuleReference(this, module);
            }

            SymbolsMap.Add(module, moduleRef);

            return moduleRef;
        }
コード例 #53
0
    public virtual Differences VisitAssemblyReference(AssemblyReference/*!*/ assemblyReference1, AssemblyReference assemblyReference2) {
      Differences differences = new Differences(assemblyReference1, assemblyReference2);
      if (assemblyReference1 == null || assemblyReference2 == null){
        if (assemblyReference1 != assemblyReference2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++;
        return differences;
      }
      AddressDereference changes = (AddressDereference)assemblyReference2.Clone();
      AddressDereference deletions = (AddressDereference)assemblyReference2.Clone();
      AddressDereference insertions = (AddressDereference)assemblyReference2.Clone();

      if (assemblyReference1.Culture == assemblyReference2.Culture) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;
      if (assemblyReference1.Flags == assemblyReference2.Flags) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;
      if (assemblyReference1.Name == assemblyReference2.Name) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;
      if (this.ValuesAreEqual(assemblyReference1.PublicKeyOrToken, assemblyReference2.PublicKeyOrToken)) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;
      if (assemblyReference1.Version == assemblyReference2.Version) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;

      if (differences.NumberOfDifferences == 0){
        differences.Changes = null;
        differences.Deletions = null;
        differences.Insertions = null;
      }else{
        differences.Changes = changes;
        differences.Deletions = deletions;
        differences.Insertions = insertions;
      }
      return differences;
    }
コード例 #54
0
 /// <summary>
 /// Populates the list of assembly references.
 /// </summary>
 void LoadAssemblyReferences()
   //^ ensures this.AssemblyReferenceArray != null;
 {
   uint numberOfAssemblyReferences = this.PEFileReader.AssemblyRefTable.NumberOfRows;
   AssemblyReference[] assemblyRefList = new AssemblyReference[numberOfAssemblyReferences + 1];
   for (uint i = 1; i <= numberOfAssemblyReferences; ++i) {
     AssemblyRefRow assemblyRefRow = this.PEFileReader.AssemblyRefTable[i];
     IName assemblyRefName = this.GetNameFromOffset(assemblyRefRow.Name);
     IName cultureName = this.GetNameFromOffset(assemblyRefRow.Culture);
     Version version = new Version(assemblyRefRow.MajorVersion, assemblyRefRow.MinorVersion, assemblyRefRow.BuildNumber, assemblyRefRow.RevisionNumber);
     byte[] publicKeyTokenArray = TypeCache.EmptyByteArray;
     if (assemblyRefRow.PublicKeyOrToken != 0) {
       var publicKeyOrTokenArray = this.PEFileReader.BlobStream[assemblyRefRow.PublicKeyOrToken];
       if ((assemblyRefRow.Flags & AssemblyFlags.PublicKey) == AssemblyFlags.PublicKey && publicKeyOrTokenArray.Length > 0) {
         publicKeyTokenArray = UnitHelper.ComputePublicKeyToken(publicKeyOrTokenArray);
       } else {
         publicKeyTokenArray = publicKeyOrTokenArray;
       }
       if (publicKeyTokenArray.Length != 8) {
         //  Error
       }
     }
     AssemblyIdentity assemblyIdentity = new AssemblyIdentity(assemblyRefName, cultureName.Value, version, publicKeyTokenArray, string.Empty);
     AssemblyReference assemblyReference = new AssemblyReference(this, i, assemblyIdentity, assemblyRefRow.Flags);
     assemblyRefList[i] = assemblyReference;
   }
   //^ NonNullType.AssertInitialized(assemblyRefList);
   this.AssemblyReferenceArray = assemblyRefList;
 }
コード例 #55
0
		public async Task<AssemblyReference[]> ResolveAssemblyReferences (ProjectConfigurationInfo[] configurations, CancellationToken cancellationToken)
		{
			AssemblyReference[] refs = null;
			var id = configurations [0].Configuration + "|" + configurations [0].Platform;

			using (await referenceCacheLock.EnterAsync ()) {
				// Check the cache before starting the task
				if (referenceCache.TryGetValue (id, out refs))
					return refs;
			}

			// Get an id for the task, it will be used later on to cancel the task if necessary
			var taskId = Interlocked.Increment (ref lastTaskId);
			IDisposable cr = null;

			refs = await Task.Run (async () => {
				using (await referenceCacheLock.EnterAsync ()) {
					// Check again the cache, maybe the value was set while the task was starting
					if (referenceCache.TryGetValue (id, out refs))
						return refs;

					// Get ready to cancel the task if the cancellation token is signalled
					cr = RegisterCancellation (cancellationToken, taskId);

					MSBuildResult result;
					bool locked = false;
					try {
						BeginOperation ();
						locked = await engine.Semaphore.WaitAsync (Timeout.Infinite, cancellationToken).ConfigureAwait (false);
						// FIXME: This lock should not be necessary, but remoting seems to have problems when doing many concurrent calls.
						result = builder.Run (
									configurations, null, MSBuildVerbosity.Normal,
									new [] { "ResolveAssemblyReferences" }, new [] { "ReferencePath" }, null, null, taskId
								);
					} catch (Exception ex) {
						CheckDisconnected ();
						LoggingService.LogError ("ResolveAssemblyReferences failed", ex);
						return new AssemblyReference [0];
					} finally {
						if (locked)
							engine.Semaphore.Release ();
						EndOperation ();
					}

					List<MSBuildEvaluatedItem> items;
					if (result.Items.TryGetValue ("ReferencePath", out items) && items != null) {
						string aliases;
						refs = items.Select (i => new AssemblyReference (i.ItemSpec, i.Metadata.TryGetValue ("Aliases", out aliases) ? aliases : "")).ToArray ();
					} else
						refs = new AssemblyReference [0];

					referenceCache [id] = refs;
				}
				return refs;
			});

			// Dispose the cancel registration
			if (cr != null)
				cr.Dispose ();
			
			return refs;
		}
コード例 #56
0
 //  Caller should lock this.
 internal Assembly/*?*/ ResolveAssemblyRefReference(
   AssemblyReference assemblyReference
 ) {
   Assembly/*?*/ assem = this.ModuleReader.LookupAssembly(this.Module, assemblyReference.UnifiedAssemblyIdentity);
   return assem;
 }
コード例 #57
0
ファイル: StringStitcher.cs プロジェクト: picrap/StitcherBoy
 private void F(AssemblyReference[] r)
 {
     Console.WriteLine(r);
 }
コード例 #58
0
            private void VisitReference(AssemblyReference reference, Dictionary<string, AssemblyReference> referenceMap, List<AssemblyReference> referenceList)
            {
                if (reference.Visited) {
                    return;
                }

                reference.Visit();
                foreach (string dependencyName in reference.Dependencies) {
                    AssemblyReference dependencyReference;
                    if (referenceMap.TryGetValue(dependencyName, out dependencyReference)) {
                        VisitReference(dependencyReference, referenceMap, referenceList);
                    }
                }

                referenceList.Add(reference);
            }
コード例 #59
0
ファイル: Updater.cs プロジェクト: asvishnyakov/CodeContracts
 public virtual AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference, AssemblyReference changes, AssemblyReference deletions, AssemblyReference insertions){
   this.UpdateSourceContext(assemblyReference, changes);
   if (assemblyReference == null) return changes;
   if (changes != null){
     if (deletions == null || insertions == null)
       Debug.Assert(false);
     else{
       assemblyReference.Culture = changes.Culture;
       assemblyReference.Flags = changes.Flags;
       assemblyReference.Name = changes.Name;
       assemblyReference.PublicKeyOrToken = changes.PublicKeyOrToken;
       assemblyReference.Version = changes.Version;
     }
   }else if (deletions != null)
     return null;
   return assemblyReference;
 }
コード例 #60
0
ファイル: Duplicator.cs プロジェクト: hnlshzx/DotNetOpenAuth
 public override AssemblyReference VisitAssemblyReference(AssemblyReference assemblyReference)
 {
     if (assemblyReference == null) return null;
     return base.VisitAssemblyReference((AssemblyReference)assemblyReference.Clone());
 }