internal AssemblyFoldersExCache(AssemblyFoldersEx assemblyFoldersEx, FileExists fileExists) { AssemblyFoldersEx = assemblyFoldersEx; _fileExists = fileExists; if (Environment.GetEnvironmentVariable("MSBUILDDISABLEASSEMBLYFOLDERSEXCACHE") != null) { _useOriginalFileExists = true; } else { var lockobject = new Object(); Parallel.ForEach(assemblyFoldersEx.UniqueDirectoryPaths, assemblyFolder => { if (FileUtilities.DirectoryExistsNoThrow(assemblyFolder)) { string[] files = Directory.GetFiles(assemblyFolder, "*.*", SearchOption.TopDirectoryOnly); lock (lockobject) { foreach (string file in files) { _filesInDirectories.Add(file); } } } }); } }
public override bool Resolve(AssemblyNameExtension assemblyName, string rawFileNameCandidate, bool isPrimaryProjectReference, bool wantSpecificVersion, string[] executableExtensions, string hintPath, string assemblyFolderKey, ArrayList assembliesConsideredAndRejected, out string foundPath, out bool userRequestedSpecificFile) { foundPath = null; userRequestedSpecificFile = false; if (assemblyName != null) { this.LazyInitialize(); if (this.wasMatch) { AssemblyFoldersEx ex = new AssemblyFoldersEx(this.registryKeyRoot, this.targetRuntimeVersion, this.registryKeySuffix, this.osVersion, this.platform, this.getRegistrySubKeyNames, this.getRegistrySubKeyDefaultValue, base.targetProcessorArchitecture, this.openBaseKey); string str = null; foreach (string str2 in ex) { string path = base.ResolveFromDirectory(assemblyName, isPrimaryProjectReference, wantSpecificVersion, executableExtensions, str2, assembliesConsideredAndRejected); if (path != null) { if (str == null) { str = path; } if ((base.targetProcessorArchitecture != ProcessorArchitecture.MSIL) && (base.targetProcessorArchitecture != ProcessorArchitecture.None)) { foundPath = path; return(true); } AssemblyNameExtension extension = base.getAssemblyName(path); if ((extension != null) && ((extension.AssemblyName.ProcessorArchitecture == ProcessorArchitecture.MSIL) || (extension.AssemblyName.ProcessorArchitecture == ProcessorArchitecture.None))) { foundPath = path; return(true); } } } if (str != null) { foundPath = str; return(true); } } } return(false); }
public override bool Resolve(AssemblyNameExtension assemblyName, string rawFileNameCandidate, bool isPrimaryProjectReference, bool wantSpecificVersion, string[] executableExtensions, string hintPath, string assemblyFolderKey, ArrayList assembliesConsideredAndRejected, out string foundPath, out bool userRequestedSpecificFile) { foundPath = null; userRequestedSpecificFile = false; if (assemblyName != null) { this.LazyInitialize(); if (this.wasMatch) { AssemblyFoldersEx ex = new AssemblyFoldersEx(this.registryKeyRoot, this.targetRuntimeVersion, this.registryKeySuffix, this.osVersion, this.platform, this.getRegistrySubKeyNames, this.getRegistrySubKeyDefaultValue, base.targetProcessorArchitecture, this.openBaseKey); string str = null; foreach (string str2 in ex) { string path = base.ResolveFromDirectory(assemblyName, isPrimaryProjectReference, wantSpecificVersion, executableExtensions, str2, assembliesConsideredAndRejected); if (path != null) { if (str == null) { str = path; } if ((base.targetProcessorArchitecture != ProcessorArchitecture.MSIL) && (base.targetProcessorArchitecture != ProcessorArchitecture.None)) { foundPath = path; return true; } AssemblyNameExtension extension = base.getAssemblyName(path); if ((extension != null) && ((extension.AssemblyName.ProcessorArchitecture == ProcessorArchitecture.MSIL) || (extension.AssemblyName.ProcessorArchitecture == ProcessorArchitecture.None))) { foundPath = path; return true; } } } if (str != null) { foundPath = str; return true; } } } return false; }
private void LazyInitialize() { if (_isInitialized) { return; } _isInitialized = true; // Crack the search path just one time. Match match = s_crackAssemblyFoldersExSentinel.Value.Match(this.searchPathElement); _wasMatch = false; if (match.Success) { _registryKeyRoot = match.Groups["REGISTRYKEYROOT"].Value.Trim(); _targetRuntimeVersion = match.Groups["TARGETRUNTIMEVERSION"].Value.Trim(); _registryKeySuffix = match.Groups["REGISTRYKEYSUFFIX"].Value.Trim(); _osVersion = null; _platform = null; Group conditions = match.Groups["CONDITIONS"]; // Disregard if there are any empty values in the {Registry} tag. if (_registryKeyRoot.Length != 0 && _targetRuntimeVersion.Length != 0 && _registryKeySuffix.Length != 0) { // Tolerate version keys that don't begin with "v" as these could come from user input if (!_targetRuntimeVersion.StartsWith("v", StringComparison.OrdinalIgnoreCase)) { _targetRuntimeVersion = _targetRuntimeVersion.Insert(0, "v"); } if (conditions?.Value != null && conditions.Length > 0 && conditions.Value.Length > 0) { string value = conditions.Value.Trim(); // Parse the condition statement for OSVersion and Platform foreach (string c in value.Split(MSBuildConstants.ColonChar)) { if (String.Compare(c, 0, "OSVERSION=", 0, 10, StringComparison.OrdinalIgnoreCase) == 0) { _osVersion = c.Substring(10); } else if (String.Compare(c, 0, "PLATFORM=", 0, 9, StringComparison.OrdinalIgnoreCase) == 0) { _platform = c.Substring(9); } } } _wasMatch = true; bool useCache = Environment.GetEnvironmentVariable("MSBUILDDISABLEASSEMBLYFOLDERSEXCACHE") == null; string key = "ca22615d-aa83-444b-80b9-b32f3d5db097" + this.searchPathElement; if (useCache && _buildEngine != null) { _assemblyFoldersCache = _buildEngine.GetRegisteredTaskObject(key, RegisteredTaskObjectLifetime.Build) as AssemblyFoldersExCache; } if (_assemblyFoldersCache == null) { AssemblyFoldersEx assemblyFolders = new AssemblyFoldersEx(_registryKeyRoot, _targetRuntimeVersion, _registryKeySuffix, _osVersion, _platform, _getRegistrySubKeyNames, _getRegistrySubKeyDefaultValue, this.targetProcessorArchitecture, _openBaseKey); _assemblyFoldersCache = new AssemblyFoldersExCache(assemblyFolders, fileExists); if (useCache) { _buildEngine?.RegisterTaskObject(key, _assemblyFoldersCache, RegisteredTaskObjectLifetime.Build, true /* dispose early ok*/); } } fileExists = _assemblyFoldersCache.FileExists; } } }
/// <summary> /// Constructor /// </summary> internal AssemblyFoldersExCache(AssemblyFoldersEx assemblyFoldersEx, FileExists fileExists) { _assemblyFoldersEx = assemblyFoldersEx; _fileExists = fileExists; if (Environment.GetEnvironmentVariable("MSBUILDDISABLEASSEMBLYFOLDERSEXCACHE") != null) { _useOriginalFileExists = true; } else { Object lockobject = new Object(); Parallel.ForEach<AssemblyFoldersExInfo>(assemblyFoldersEx, assemblyFolder => { if (FileUtilities.DirectoryExistsNoThrow(assemblyFolder.DirectoryPath)) { string[] files = Directory.GetFiles(assemblyFolder.DirectoryPath, "*.*", SearchOption.TopDirectoryOnly); lock (lockobject) { foreach (string file in files) { _filesInDirectories.Add(file); } } } }); } }
/// <summary> /// Initialize this class if it hasn't been initialized yet. /// </summary> private void LazyInitialize() { if (_isInitialized) return; _isInitialized = true; // Crack the search path just one time. Match match = s_crackAssemblyFoldersExSentinel.Match(this.searchPathElement); _wasMatch = false; if (match.Success) { _registryKeyRoot = match.Groups["REGISTRYKEYROOT"].Value.Trim(); _targetRuntimeVersion = match.Groups["TARGETRUNTIMEVERSION"].Value.Trim(); _registryKeySuffix = match.Groups["REGISTRYKEYSUFFIX"].Value.Trim(); _osVersion = null; _platform = null; Group conditions = match.Groups["CONDITIONS"]; // Disregard if there are any empty values in the {Registry} tag. if (_registryKeyRoot.Length != 0 && _targetRuntimeVersion.Length != 0 && _registryKeySuffix.Length != 0) { // Tolerate version keys that don't begin with "v" as these could come from user input if (!_targetRuntimeVersion.StartsWith("v", StringComparison.OrdinalIgnoreCase)) { _targetRuntimeVersion = _targetRuntimeVersion.Insert(0, "v"); } if (conditions != null && conditions.Value != null && conditions.Length > 0 && conditions.Value.Length > 0) { string value = conditions.Value.Trim(); // Parse the condition statement for OSVersion and Platform foreach (string c in value.Split(':')) { if (String.Compare(c, 0, "OSVERSION=", 0, 10, StringComparison.OrdinalIgnoreCase) == 0) { _osVersion = c.Substring(10); } else if (String.Compare(c, 0, "PLATFORM=", 0, 9, StringComparison.OrdinalIgnoreCase) == 0) { _platform = c.Substring(9); } } } _wasMatch = true; bool useCache = Environment.GetEnvironmentVariable("MSBUILDDISABLEASSEMBLYFOLDERSEXCACHE") == null; string key = "ca22615d-aa83-444b-80b9-b32f3d5db097" + this.searchPathElement; if (useCache && _buildEngine != null) { _assemblyFoldersCache = _buildEngine.GetRegisteredTaskObject(key, RegisteredTaskObjectLifetime.Build) as AssemblyFoldersExCache; } if (_assemblyFoldersCache == null) { AssemblyFoldersEx assemblyFolders = new AssemblyFoldersEx(_registryKeyRoot, _targetRuntimeVersion, _registryKeySuffix, _osVersion, _platform, _getRegistrySubKeyNames, _getRegistrySubKeyDefaultValue, this.targetProcessorArchitecture, _openBaseKey); _assemblyFoldersCache = new AssemblyFoldersExCache(assemblyFolders, fileExists); if (useCache && _buildEngine != null) { _buildEngine.RegisterTaskObject(key, _assemblyFoldersCache, RegisteredTaskObjectLifetime.Build, true /* dispose early ok*/); } } fileExists = _assemblyFoldersCache.FileExists; } } }