private Assembly TryLoadBuildScriptFromAssembly(string buildScriptAssemblyPath, string buildScriptFilePath, ScriptAnalyzerResult scriptAnalyzerResult, ProjectFileAnalyzerResult projectFileAnalyzerResult) { if (!File.Exists(buildScriptAssemblyPath)) { return(null); } var buildScriptAssemblyModified = File.GetLastWriteTime(buildScriptAssemblyPath); var buildScriptFileModified = File.GetLastWriteTime(buildScriptFilePath); if (buildScriptFileModified > buildScriptAssemblyModified) { return(null); } if (projectFileAnalyzerResult.ProjectFileFound) { var projectFileModified = File.GetLastWriteTime(projectFileAnalyzerResult.ProjectFileLocation); if (projectFileModified > buildScriptAssemblyModified) { return(null); } } foreach (var csFile in scriptAnalyzerResult.CsFiles) { if (File.Exists(csFile)) { var csFileModifiedTime = File.GetLastWriteTime(csFile); if (csFileModifiedTime > buildScriptAssemblyModified) { return(null); } } } foreach (var partialCsFile in scriptAnalyzerResult.PartialCsFiles) { var csFileModifiedTime = File.GetLastWriteTime(partialCsFile); if (csFileModifiedTime > buildScriptAssemblyModified) { return(null); } } #if NETSTANDARD1_6 using (FileStream dllStream = new FileStream(buildScriptAssemblyPath, FileMode.Open, FileAccess.Read)) { using (FileStream pdbStream = new FileStream(Path.ChangeExtension(buildScriptAssemblyPath, "pdb"), FileMode.Open, FileAccess.Read)) { return(AssemblyLoadContext.Default.LoadFromStream(dllStream, pdbStream)); } } #else return(Assembly.Load(File.ReadAllBytes(buildScriptAssemblyPath), File.ReadAllBytes(Path.ChangeExtension(buildScriptAssemblyPath, "pdb")))); #endif }
private IEnumerable <MetadataReference> GetBuildScriptReferences(CommandArguments args, ProjectFileAnalyzerResult projectFileAnalyzerResult, ScriptAnalyzerResult scriptAnalyzerResult, bool oldWay, string pathToBuildScript) { var coreDir = Path.GetDirectoryName(typeof(object).GetTypeInfo().Assembly.Location); var flubuCoreAssembly = typeof(DefaultBuildScript).GetTypeInfo().Assembly; //// Default assemblies that should be referenced. var assemblyReferences = oldWay ? GetBuildScriptReferencesForOldWayBuildScriptCreation() : GetDefaultReferences(coreDir); // Enumerate all assemblies referenced by FlubuCore // and provide them as references to the build script we're about to // compile. AssemblyName[] flubuReferencedAssemblies = flubuCoreAssembly.GetReferencedAssemblies(); foreach (var referencedAssembly in flubuReferencedAssemblies) { Assembly loadedAssembly = Assembly.Load(referencedAssembly); if (string.IsNullOrEmpty(loadedAssembly.Location)) { continue; } assemblyReferences.AddOrUpdateAssemblyInfo(new AssemblyInfo { Name = referencedAssembly.Name, Version = referencedAssembly.Version, FullPath = loadedAssembly.Location, }); } assemblyReferences.AddOrUpdateAssemblyInfo(scriptAnalyzerResult.AssemblyReferences); assemblyReferences.AddOrUpdateAssemblyInfo(projectFileAnalyzerResult.HasAnyNugetReferences ? _nugetPackageResolver.ResolveNugetPackagesFromFlubuCsproj(projectFileAnalyzerResult) : _nugetPackageResolver.ResolveNugetPackagesFromDirectives(scriptAnalyzerResult.NugetPackageReferences, pathToBuildScript)); AddAssemblyReferencesFromCsproj(projectFileAnalyzerResult, assemblyReferences); var assemblyReferencesLocations = assemblyReferences.Select(x => x.FullPath).ToList(); assemblyReferencesLocations.AddRange(FindAssemblyReferencesInDirectories(args.AssemblyDirectories)); assemblyReferencesLocations = assemblyReferencesLocations.Distinct().Where(x => !string.IsNullOrEmpty(x)).ToList(); var references = assemblyReferencesLocations.Select(i => { return(MetadataReference.CreateFromFile(i)); }); #if !NET462 foreach (var assemblyReferenceLocation in assemblyReferencesLocations) { try { AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyReferenceLocation); } catch (Exception) { } } #endif return(references); }
public List <AssemblyInfo> ResolveNugetPackagesFromFlubuCsproj(ProjectFileAnalyzerResult analyzerResult) { List <AssemblyInfo> assemblyReferences = new List <AssemblyInfo>(); var nugetReferences = analyzerResult.NugetReferences.Where(x => !x.Id.Equals("FlubuCore", StringComparison.OrdinalIgnoreCase) && !x.Id.Equals("dotnet-flubu", StringComparison.OrdinalIgnoreCase) && !x.Id.Equals("FlubuCore.Runner", StringComparison.OrdinalIgnoreCase) && !x.Id.StartsWith("StyleCop", StringComparison.OrdinalIgnoreCase)).ToList(); if (nugetReferences.Count == 0) { return(assemblyReferences); } string csprojLocation = analyzerResult.ProjectFileLocation; var csprojDir = Path.GetDirectoryName(csprojLocation); var csprojfileName = Path.GetFileName(csprojLocation); var nugetPropsLocation = Path.Combine(csprojDir, "obj", csprojfileName + ".nuget.g.props"); bool nugetPropsFileExists = _file.Exists(nugetPropsLocation); bool mustRestoreNugetPackages = true; if (nugetPropsFileExists) { #pragma warning disable SA1305 // Field names should not use Hungarian notation var csProjModifiedTime = File.GetLastWriteTime(csprojLocation); #pragma warning restore SA1305 // Field names should not use Hungarian notation var nugetProsModifiedTime = File.GetLastWriteTime(nugetPropsLocation); if (nugetProsModifiedTime > csProjModifiedTime) { mustRestoreNugetPackages = false; } } var targetFramework = GetTargetFramework(); if (mustRestoreNugetPackages) { if (nugetPropsFileExists) { File.Delete(nugetPropsLocation); } RestoreNugetPackages(csprojLocation); } var document = XDocument.Load(nugetPropsLocation); var packageFolders = document.Descendants().Single(d => d.Name.LocalName == "NuGetPackageFolders").Value .Split(';'); var dependencyContext = ReadDependencyContext(Path.Combine(csprojDir, "obj", "project.assets.json")); var compileLibraries = dependencyContext.CompileLibraries.ToList(); foreach (var packageReference in nugetReferences) { CompilationLibrary compileLibrary = compileLibraries.FirstOrDefault(x => x.Name.Equals(packageReference.Id, StringComparison.OrdinalIgnoreCase)); if (compileLibrary == null) { throw new ScriptException( $"Nuget package '{packageReference.Id}' '{packageReference.Version}' not found."); } if (compileLibrary.Assemblies.Count != 0) { bool packageFound = AddAssemblyReference(packageFolders, compileLibrary, assemblyReferences); if (!packageFound) { throw new ScriptException($"Nuget package {packageReference.Id} not found."); } ResolveDependencies(compileLibrary, compileLibraries, packageFolders, assemblyReferences); } else { if (compileLibrary.Dependencies.Count != 0) { ResolveDependencies(compileLibrary, compileLibraries, packageFolders, assemblyReferences); } else { throw new ScriptException($"Nuget package '{packageReference.Id}' '{packageReference.Version}' not found for framework {targetFramework} "); } } } File.Delete(NugetPackageResolveConstants.GeneratedProjectFileName); return(assemblyReferences); }