Beispiel #1
0
        public void SystemRuntimeDepends_Yes_Indirect()
        {
            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine = new MockEngine();

            t.Assemblies = new ITaskItem[]
            {
                new TaskItem("Portable"),
            };

            t.Assemblies[0].SetMetadata("HintPath", @"C:\SystemRuntime\Portable.dll");

            t.SearchPaths = DefaultPaths;

            // build mode
            t.FindDependencies = true;

            Assert.True(t.Execute(fileExists, directoryExists, getDirectories, getAssemblyName, getAssemblyMetadata, getRegistrySubKeyNames, getRegistrySubKeyDefaultValue, getLastWriteTime, getRuntimeVersion, openBaseKey, checkIfAssemblyIsInGac, isWinMDFile, readMachineTypeFromPEHeader));

            Assert.True(string.Equals(t.DependsOnSystemRuntime, "true", StringComparison.OrdinalIgnoreCase)); //                 "Expected System.Runtime dependency found during build."

            // intelli build mode
            t.FindDependencies = false;
            Assert.True(t.Execute(fileExists, directoryExists, getDirectories, getAssemblyName, getAssemblyMetadata, getRegistrySubKeyNames, getRegistrySubKeyDefaultValue, getLastWriteTime, getRuntimeVersion, openBaseKey, checkIfAssemblyIsInGac, isWinMDFile, readMachineTypeFromPEHeader));

            Assert.True(string.Equals(t.DependsOnSystemRuntime, "true", StringComparison.OrdinalIgnoreCase)); //                 "Expected System.Runtime dependency found during intellibuild."
        }
Beispiel #2
0
        public void NETStandardDepends_Yes_Indirect()
        {
            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine = new MockEngine();

            t.Assemblies = new ITaskItem[]
            {
                new TaskItem("netstandardlibrary"),
            };

            t.Assemblies[0].SetMetadata("HintPath", s_netstandardLibraryDllPath);

            t.SearchPaths = DefaultPaths;

            // build mode
            t.FindDependencies = true;

            Assert.True(t.Execute(fileExists, directoryExists, getDirectories, getAssemblyName, getAssemblyMetadata, getRegistrySubKeyNames, getRegistrySubKeyDefaultValue, getLastWriteTime, getRuntimeVersion, openBaseKey, checkIfAssemblyIsInGac, isWinMDFile, readMachineTypeFromPEHeader));

            Console.WriteLine(((MockEngine)t.BuildEngine).Log);
            Assert.True(string.Equals(t.DependsOnNETStandard, "true", StringComparison.OrdinalIgnoreCase)); //                 "Expected netstandard dependency found during build."

            // intelli build mode
            t.FindDependencies = false;
            Assert.True(t.Execute(fileExists, directoryExists, getDirectories, getAssemblyName, getAssemblyMetadata, getRegistrySubKeyNames, getRegistrySubKeyDefaultValue, getLastWriteTime, getRuntimeVersion, openBaseKey, checkIfAssemblyIsInGac, isWinMDFile, readMachineTypeFromPEHeader));

            Assert.True(string.Equals(t.DependsOnNETStandard, "true", StringComparison.OrdinalIgnoreCase)); //                 "Expected netstandard dependency found during intellibuild."
        }
        public void HigherVersionDirectDependenciesFalse()
        {
            MockEngine e = new MockEngine();

            TaskItem item = new TaskItem("DependsOnFoo45Framework");

            ITaskItem[] items = new ITaskItem[]
            {
                item
            };

            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine                       = e;
            t.Assemblies                        = items;
            t.FindDependencies                  = false;
            t.TargetFrameworkMoniker            = "Foo, Version=4.0";
            t.TargetFrameworkMonikerDisplayName = "Foo";
            t.SearchPaths                       = new string[] { @"c:\Frameworks\" };
            Assert.True(t.Execute(fileExists, directoryExists, getDirectories, getAssemblyName, getAssemblyMetadata, getRegistrySubKeyNames, getRegistrySubKeyDefaultValue, getLastWriteTime, getRuntimeVersion, openBaseKey, checkIfAssemblyIsInGac, isWinMDFile, readMachineTypeFromPEHeader));


            Assert.Equal(0, e.Warnings); // "No warning expected in this scenario."
            Assert.Equal(0, e.Errors);   // "No errors expected in this scenario."
            Assert.Equal(1, t.ResolvedFiles.Length);
            Assert.Equal(0, t.ResolvedDependencyFiles.Length);
            Assert.True(ContainsItem(t.ResolvedFiles, Path.Combine(s_frameworksPath, "DependsOnFoo45Framework.dll"))); // "Expected to find assembly, but didn't."
        }
        private static AssemblyResolutionResult ResolveAssembly(string assemblyName, IList <string> searchPaths, IList <string> targetFrameworkDirectories, bool checkDependencies)
        {
            ResolveAssemblyReference reference = new ResolveAssemblyReference();
            MockEngine engine = new MockEngine();

            reference.BuildEngine = engine;
            if (searchPaths != null)
            {
                reference.SearchPaths = searchPaths.ToArray <string>();
            }
            if (targetFrameworkDirectories != null)
            {
                reference.TargetFrameworkDirectories = targetFrameworkDirectories.ToArray <string>();
            }
            reference.Assemblies = new ITaskItem[] { new TaskItem(assemblyName) };
            reference.Silent     = true;
            reference.Execute();
            AssemblyResolutionResult result = new AssemblyResolutionResult();
            List <string>            list   = new List <string>();

            foreach (ITaskItem item in reference.ResolvedFiles)
            {
                list.Add(item.ItemSpec);
            }
            if (checkDependencies)
            {
                CheckOutOfRangeDependencies(assemblyName);
            }
            result.ResolvedFiles = list.ToArray();
            result.Warnings      = engine.Warnings;
            result.Errors        = engine.Errors;
            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// Resolves the given references
        /// </summary>
        /// <param name="proj">The Project to resolve external references for</param>
        /// <returns>The resolved references</returns>
        public override IEnumerable <ResolvedReference> ResolveReferences(Project proj)
        {
            IEnumerable <ProjectItem> references = proj.Items.Where(itm => itm.ItemType == "Reference");

            if (references.Count() == 0)
            {
                return(new List <ResolvedReference>());
            }

            // Create task items from references
            List <ITaskItem> taskItems = new List <ITaskItem>();

            foreach (ProjectItem item in references)
            {
                taskItems.Add(new ReferenceTaskItem(item));
            }
            taskItems.Add(new TaskItem("System.Core"));
            taskItems.Add(new TaskItem("System.Runtime"));

            // Use resolve assembly reference and add the task items
            ResolveAssemblyReference resolver = new ResolveAssemblyReference
            {
                Assemblies = taskItems.ToArray(),

                // These props come from the inputs
                TargetFrameworkDirectories = _paramProvider.TargetFrameworkDirectories,
                SearchPaths = _paramProvider.SearchPaths,
                AllowedAssemblyExtensions      = _paramProvider.AllowedAssemblyExtensions,
                TargetProcessorArchitecture    = _paramProvider.TargetProcessorArchitecture,
                TargetFrameworkMoniker         = _paramProvider.TargetFrameworkMoniker,
                TargetedRuntimeVersion         = _paramProvider.TargetedRuntimeVersion,
                TargetFrameworkVersion         = _paramProvider.TargetFrameworkVersion,
                AllowedRelatedFileExtensions   = _paramProvider.AllowedRelatedFileExtensions,
                FullTargetFrameworkSubsetNames = _paramProvider.FullTargetFrameworkSubsetNames,
                FullFrameworkFolders           = _paramProvider.FullFrameworkFolders,

                // these are just defaulted (which i guess i could add as an input, but i don't really know what they do)
                AutoUnify      = true,
                FindSatellites = true,
                BuildEngine    = new DummyBuildEngine(references.First().Project)
            };

            resolver.Execute();

            return(resolver.ResolvedFiles
                   .Select(taskItem => new ResolvedReference(
                               taskItem.ItemSpec,
                               taskItem.GetMetadata("EmbedInteropTypes").ToUpper() == "TRUE")
                           )
                   .Union(resolver.ResolvedDependencyFiles.Select(taskItem => new ResolvedReference(
                                                                      taskItem.ItemSpec,
                                                                      taskItem.GetMetadata("EmbedInteropTypes").ToUpper() == "TRUE")
                                                                  )));
        }
Beispiel #6
0
        private string GetAssemblyFileFromAssemblyName(string assemblyName, ProjectItem reference = null, Project project = null)
        {
            string result;

            if (assemblyNameToAssemblyFileMap.TryGetValue(assemblyName, out result))
            {
                return(result);
            }

            IDictionary metadata = null;

            if (reference != null)
            {
                metadata = reference.Metadata.ToDictionary(m => m.Name, m => m.EvaluatedValue);
            }

            ResolveAssemblyReference resolveTask = new ResolveAssemblyReference();
            string   referenceString             = assemblyName;
            TaskItem taskItem = metadata != null ? new TaskItem(referenceString, metadata) : new TaskItem(referenceString);

            resolveTask.Assemblies  = new ITaskItem[] { taskItem };
            resolveTask.Silent      = true;
            resolveTask.SearchPaths = assemblySearchPaths;

            if (project != null)
            {
                resolveTask.TargetFrameworkVersion            = project.GetPropertyValue("TargetFrameworkVersion");
                resolveTask.TargetFrameworkMoniker            = project.GetPropertyValue("TargetFrameworkMoniker");
                resolveTask.TargetFrameworkMonikerDisplayName = project.GetPropertyValue("TargetFrameworkMonikerDisplayName");
                resolveTask.TargetedRuntimeVersion            = project.GetPropertyValue("TargetRuntimeVersion");
                resolveTask.TargetFrameworkDirectories        = new[] { project.GetPropertyValue("FrameworkPathOverride") };
            }

            try
            {
                if (!resolveTask.Execute() || resolveTask.ResolvedFiles.Length == 0)
                {
                    Log("===> Failed to resolve assembly: " + assemblyName);
                    return(null);
                }
            }
            catch
            {
                return(null);
            }

            result = resolveTask.ResolvedFiles[0].ItemSpec;
            result = Path.GetFullPath(result);
            assemblyNameToAssemblyFileMap.Add(assemblyName, result);

            return(result);
        }
Beispiel #7
0
        // NOTE: https://github.com/Microsoft/msbuild/wiki/ResolveAssemblyReference
        private static ITaskItem[] ResolveAssemblyReferences(Project project)
        {
            var searchPaths          = GetSearchPaths(project);
            var frameworkDirectories = GetFrameworkDirectories(project);
            var references           = GetReferences(project);
            var explicitReferences   = GetAssemblyFiles(project);
            var appConfigFile        = GetAppConfigFile(project);

            /// TODO: each project will create the same logger -> use pool of objects in <see cref="LogManager"/>
            using (var logger = LogManager.GetLogger("ResolveReference"))
            {
                logger.Info("Executing ResolveAssemblyReference task...");
                var resolveTask = new ResolveAssemblyReference
                {
                    BuildEngine                       = new MsBuildEngine(logger),
                    Assemblies                        = references,
                    AssemblyFiles                     = explicitReferences,
                    TargetFrameworkVersion            = project.GetPropertyValue("TargetFrameworkVersion"),
                    TargetFrameworkMoniker            = project.GetPropertyValue("TargetFrameworkMoniker"),
                    SearchPaths                       = searchPaths,
                    TargetFrameworkDirectories        = frameworkDirectories,
                    TargetedRuntimeVersion            = project.GetPropertyValue("TargetedRuntimeVersion"),
                    TargetFrameworkMonikerDisplayName = project.GetPropertyValue("TargetFrameworkMonikerDisplayName"),
                    AppConfigFile                     = appConfigFile,
                    AllowedAssemblyExtensions         = allowedAssemblyExtensions,
                    AutoUnify = project.GetPropertyValue("AutoUnifyAssemblyReferences").IsTrue()
                };

                var result = resolveTask.Execute();
                if (result)
                {
                    logger.Info("ResolveAssemblyReference task was successfully done");
                }
                else
                {
                    logger.Error("ResolveAssemblyReference task was failed");
                }
                //ProjectCollection.GlobalProjectCollection.UnloadProject(project);
                return(resolveTask.ResolvedFiles);
            }
        }
        public void DependsOn_NETStandard_and_SystemRuntime_ExternallyResolved()
        {
            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine = new MockEngine(_output);

            t.Assemblies = new ITaskItem[]
            {
                new TaskItem("netstandardlibrary"),
                new TaskItem("Portable"),
            };

            t.Assemblies[0].SetMetadata("ExternallyResolved", "true");
            t.Assemblies[0].SetMetadata("HintPath", s_netstandardLibraryDllPath);
            t.Assemblies[1].SetMetadata("ExternallyResolved", "true");
            t.Assemblies[1].SetMetadata("HintPath", s_portableDllPath);

            t.SearchPaths = DefaultPaths;

            // build mode
            t.FindDependencies = true;

            Assert.True(t.Execute(
                            fileExists,
                            directoryExists,
                            getDirectories,
                            getAssemblyName,
                            getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                            getRegistrySubKeyNames,
                            getRegistrySubKeyDefaultValue,
#endif
                            getLastWriteTime,
                            getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                            openBaseKey,
#endif
                            checkIfAssemblyIsInGac,
                            isWinMDFile,
                            readMachineTypeFromPEHeader));

            Assert.Equal("true", t.DependsOnSystemRuntime, true); // "Expected System.Runtime dependency found during build."
            Assert.Equal("true", t.DependsOnNETStandard, true);   //                   "Expected netstandard dependency found during build."

            // intelli build mode
            t.FindDependencies = false;
            Assert.True(t.Execute(
                            fileExists,
                            directoryExists,
                            getDirectories,
                            getAssemblyName,
                            getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                            getRegistrySubKeyNames,
                            getRegistrySubKeyDefaultValue,
#endif
                            getLastWriteTime,
                            getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                            openBaseKey,
#endif
                            checkIfAssemblyIsInGac,
                            isWinMDFile,
                            readMachineTypeFromPEHeader));

            Assert.Equal("true", t.DependsOnSystemRuntime, true); // "Expected System.Runtime dependency found during intellibuild."
            Assert.Equal("true", t.DependsOnNETStandard, true);   //                   "Expected netstandard dependency found during intellibuild."
        }
        public void SystemRuntimeDepends_Yes()
        {
            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine = new MockEngine(_output);

            t.Assemblies = new ITaskItem[]
            {
                new TaskItem("System.Runtime"),
            };

            t.Assemblies[0].SetMetadata("HintPath", @"C:\SystemRuntime\System.Runtime.dll");

            t.SearchPaths = DefaultPaths;

            // build mode
            t.FindDependencies = true;

            Assert.True(
                t.Execute
                (
                    fileExists,
                    directoryExists,
                    getDirectories,
                    getAssemblyName,
                    getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                    getRegistrySubKeyNames,
                    getRegistrySubKeyDefaultValue,
#endif
                    getLastWriteTime,
                    getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                    openBaseKey,
#endif
                    checkIfAssemblyIsInGac,
                    isWinMDFile,
                    readMachineTypeFromPEHeader
                )
                );

            Assert.Equal("true", t.DependsOnSystemRuntime, true); // "Expected System.Runtime dependency found during build."

            // intelli build mode
            t.FindDependencies = false;
            Assert.True(
                t.Execute
                (
                    fileExists,
                    directoryExists,
                    getDirectories,
                    getAssemblyName,
                    getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                    getRegistrySubKeyNames,
                    getRegistrySubKeyDefaultValue,
#endif
                    getLastWriteTime,
                    getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                    openBaseKey,
#endif
                    checkIfAssemblyIsInGac,
                    isWinMDFile,
                    readMachineTypeFromPEHeader
                )
                );

            Assert.Equal("true", t.DependsOnSystemRuntime, true); // "Expected System.Runtime dependency found during intellibuild."
        }
Beispiel #10
0
        public void SystemRuntimeDepends_No_Build()
        {
            ResolveAssemblyReference t = new ResolveAssemblyReference();

            t.BuildEngine = new MockEngine();

            t.Assemblies = new ITaskItem[]
            {
                new TaskItem("Regular"),
            };

            t.Assemblies[0].SetMetadata("HintPath", @"C:\SystemRuntime\Regular.dll");

            t.SearchPaths = DefaultPaths;

            // build mode
            t.FindDependencies = true;
            Assert.True(
                t.Execute
                (
                    fileExists,
                    directoryExists,
                    getDirectories,
                    getAssemblyName,
                    getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                    getRegistrySubKeyNames,
                    getRegistrySubKeyDefaultValue,
#endif
                    getLastWriteTime,
                    getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                    openBaseKey,
#endif
                    checkIfAssemblyIsInGac,
                    isWinMDFile,
                    readMachineTypeFromPEHeader
                )
                );

            Assert.True(string.Equals(t.DependsOnSystemRuntime, "false", StringComparison.OrdinalIgnoreCase)); //                 "Expected no System.Runtime dependency found during build."
            Assert.True(string.Equals(t.DependsOnNETStandard, "false", StringComparison.OrdinalIgnoreCase));   //                   "Expected no netstandard dependency found during build."

            // intelli build mode
            t.FindDependencies = false;
            Assert.True(
                t.Execute
                (
                    fileExists,
                    directoryExists,
                    getDirectories,
                    getAssemblyName,
                    getAssemblyMetadata,
#if FEATURE_WIN32_REGISTRY
                    getRegistrySubKeyNames,
                    getRegistrySubKeyDefaultValue,
#endif
                    getLastWriteTime,
                    getRuntimeVersion,
#if FEATURE_WIN32_REGISTRY
                    openBaseKey,
#endif
                    checkIfAssemblyIsInGac,
                    isWinMDFile,
                    readMachineTypeFromPEHeader
                )
                );

            Assert.True(string.Equals(t.DependsOnSystemRuntime, "false", StringComparison.OrdinalIgnoreCase)); //                 "Expected no System.Runtime dependency found during intellibuild."
            Assert.True(string.Equals(t.DependsOnNETStandard, "false", StringComparison.OrdinalIgnoreCase));   //                   "Expected no netstandard dependency found during intellibuild."
        }