Пример #1
0
        /// <summary>
        /// Given an unresolved reference (one that we don't know the full name for yet), figure out the 
        /// full name. Should only be called on references that haven't been resolved yet--otherwise, its
        /// a perf problem.
        /// </summary>
        /// <param name="referenceFusionName">The fusion name for this reference.</param>
        /// <param name="rawFileNameCandidate">The file name to match if {RawFileName} is seen. (May be null).</param>
        /// <param name="reference">The reference object.</param>
        private void ResolveReference
        (
            AssemblyNameExtension assemblyName,
            string rawFileNameCandidate,
            Reference reference
        )
        {
            // Now, resolve this reference.
            string resolvedPath = null;
            string resolvedSearchPath = String.Empty;
            bool userRequestedSpecificFile = false;

            // A list of assemblies that might have been matches but weren't
            ArrayList assembliesConsideredAndRejected = new ArrayList();

            // First, look for the dependency in the parents' directories. Unless they are resolved from the GAC or assemblyFoldersEx then 
            // we should make sure we use the GAC and assemblyFolders resolvers themserves rather than a directory resolver to find the reference.\
            // this way we dont get assemblies pulled from the GAC or AssemblyFolders but dont have the marking that they were pulled form there.
            Hashtable parentReferenceFolderHash = new Hashtable(StringComparer.OrdinalIgnoreCase);
            List<string> parentReferenceFolders = new List<string>();
            foreach (Reference parentReference in reference.GetDependees())
            {
                CalcuateParentAssemblyDirectories(parentReferenceFolderHash, parentReferenceFolders, parentReference);
            }

            // Build the set of resolvers.
            List<Resolver[]> jaggedResolvers = new List<Resolver[]>();

            // If a reference has an SDK name on it then we must ONLY resolve it from the SDK which matches the SDKName on the refernce metadata
            // this is to support the case where a single reference assembly is selected from the SDK.
            // If a reference has the SDKName metadata on it then we will only search using a single resolver, that is the InstalledSDKResolver.
            if (reference.SDKName.Length > 0)
            {
                jaggedResolvers.Add(new Resolver[] { new InstalledSDKResolver(_resolvedSDKReferences, "SDKResolver", _getAssemblyName, _fileExists, _getRuntimeVersion, _targetedRuntimeVersion) });
            }
            else
            {
                jaggedResolvers.Add(AssemblyResolution.CompileDirectories(parentReferenceFolders, _fileExists, _getAssemblyName, _getRuntimeVersion, _targetedRuntimeVersion));
                jaggedResolvers.Add(_compiledSearchPaths);
            }

            // Resolve
            try
            {
                resolvedPath = AssemblyResolution.ResolveReference
                (
                    jaggedResolvers,
                    assemblyName,
                    reference.SDKName,
                    rawFileNameCandidate,
                    reference.IsPrimary,
                    reference.WantSpecificVersion,
                    reference.GetExecutableExtensions(_allowedAssemblyExtensions),
                    reference.HintPath,
                    reference.AssemblyFolderKey,
                    assembliesConsideredAndRejected,
                    out resolvedSearchPath,
                    out userRequestedSpecificFile
                );
            }
            catch (System.BadImageFormatException e)
            {
                reference.AddError(new DependencyResolutionException(e.Message, e));
            }

            // Update the list of assemblies considered and rejected.
            reference.AddAssembliesConsideredAndRejected(assembliesConsideredAndRejected);

            // If the path was resolved, then specify the full path on the reference.
            if (resolvedPath != null)
            {
                if (!Path.IsPathRooted(resolvedPath))
                {
                    resolvedPath = Path.GetFullPath(resolvedPath);
                }

                reference.FullPath = resolvedPath;
                reference.ResolvedSearchPath = resolvedSearchPath;
                reference.UserRequestedSpecificFile = userRequestedSpecificFile;
            }
            else
            {
                if (assemblyName != null)
                {
                    reference.AddError
                    (
                        new ReferenceResolutionException
                        (
                            ResourceUtilities.FormatResourceString("General.CouldNotLocateAssembly", assemblyName.FullName),
                            null
                        )
                    );
                }
            }
        }
 private void ResolveReference(AssemblyNameExtension assemblyName, string rawFileNameCandidate, Reference reference)
 {
     string path = null;
     string resolvedSearchPath = string.Empty;
     bool userRequestedSpecificFile = false;
     ArrayList assembliesConsideredAndRejected = new ArrayList();
     Hashtable parentReferenceFolderHash = new Hashtable(StringComparer.OrdinalIgnoreCase);
     List<string> parentReferenceFolders = new List<string>();
     foreach (Reference reference2 in reference.GetDependees())
     {
         CalcuateParentAssemblyDirectories(parentReferenceFolderHash, parentReferenceFolders, reference2);
     }
     List<Microsoft.Build.Tasks.Resolver[]> jaggedResolvers = new List<Microsoft.Build.Tasks.Resolver[]> {
         AssemblyResolution.CompileDirectories(parentReferenceFolders, this.fileExists, this.getAssemblyName, this.getRuntimeVersion, this.targetedRuntimeVersion),
         this.compiledSearchPaths
     };
     try
     {
         path = AssemblyResolution.ResolveReference(jaggedResolvers, assemblyName, rawFileNameCandidate, reference.IsPrimary, reference.WantSpecificVersion, reference.GetExecutableExtensions(this.allowedAssemblyExtensions), reference.HintPath, reference.AssemblyFolderKey, assembliesConsideredAndRejected, out resolvedSearchPath, out userRequestedSpecificFile);
     }
     catch (BadImageFormatException exception)
     {
         reference.AddError(new DependencyResolutionException(exception.Message, exception));
     }
     reference.AddAssembliesConsideredAndRejected(assembliesConsideredAndRejected);
     if (path != null)
     {
         if (!Path.IsPathRooted(path))
         {
             path = Path.GetFullPath(path);
         }
         reference.FullPath = path;
         reference.ResolvedSearchPath = resolvedSearchPath;
         reference.UserRequestedSpecificFile = userRequestedSpecificFile;
     }
     else if (assemblyName != null)
     {
         reference.AddError(new ReferenceResolutionException(Microsoft.Build.Shared.ResourceUtilities.FormatResourceString("General.CouldNotLocateAssembly", new object[] { assemblyName.FullName }), null));
     }
 }