/// <summary> /// Constructor /// </summary> 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, 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.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; } } }